Ermitteln Sie, ob QTableView einen offenen Editor hat

8

Gibt es eine Möglichkeit festzustellen, ob ein QTableView einen offenen Editor in der aktuellen Zelle hat? Ich muss die folgende Situation behandeln:

  • Ein Benutzer klickt doppelt auf eine Zelle und bearbeitet die Daten, aber verlässt die Zelle im Status "edit" .
  • In einem anderen Teil der Benutzeroberfläche wird eine Aktion ausgeführt, die die ausgewählte Zeile des zugrunde liegenden Modells ändert.
  • In meiner Ansicht möchte ich feststellen, ob die neu ausgewählte Zeile mit der offenen Zeile übereinstimmt. Wenn nicht, muss ich etwas unternehmen. (Benutzer auffordern? Automatisch übernehmen? Zurücksetzen?)

Ich sehe, wie man den aktuellen Gegenstand bekommt, und kann den Delegierten für diesen Gegenstand bekommen, aber ich sehe keine isEditMode() Eigenschaft, die ich hoffte zu finden.

Kann mir jemand in die richtige Richtung zeigen?

    
Dave Mateer 06.08.2010, 18:59
quelle

6 Antworten

2

Geben Sie Ihrem Stellvertreter eine Unterklasse, sodass er einen Zugriffsmechanismus enthält, der Ihnen bei der Bearbeitung sagt:

%Vor%

Dann können Sie einfach den Delegierten überprüfen, um zu sehen, was vor sich geht. Alternativ und / oder wenn Sie mutable nicht mögen, können Sie Signale aussenden, damit Sie wissen, in welchem ​​Zustand sich der Delegierte befindet.

    
Kaleb Pederson 06.08.2010, 20:52
quelle
6
___ antwort22381065 ___

Überprüfe einfach, ob der Rückgabewert von

ist %Vor%

ist

%Vor%     
___ answer3427736 ___

Geben Sie Ihrem Stellvertreter eine Unterklasse, sodass er einen Zugriffsmechanismus enthält, der Ihnen bei der Bearbeitung sagt:

%Vor%

Dann können Sie einfach den Delegierten überprüfen, um zu sehen, was vor sich geht. Alternativ und / oder wenn Sie %code% nicht mögen, können Sie Signale aussenden, damit Sie wissen, in welchem ​​Zustand sich der Delegierte befindet.

    
___ qstntxt ___

Gibt es eine Möglichkeit festzustellen, ob ein %code% einen offenen Editor in der aktuellen Zelle hat? Ich muss die folgende Situation behandeln:

  • Ein Benutzer klickt doppelt auf eine Zelle und bearbeitet die Daten, aber verlässt die Zelle im Status "edit" .
  • In einem anderen Teil der Benutzeroberfläche wird eine Aktion ausgeführt, die die ausgewählte Zeile des zugrunde liegenden Modells ändert.
  • In meiner Ansicht möchte ich feststellen, ob die neu ausgewählte Zeile mit der offenen Zeile übereinstimmt. Wenn nicht, muss ich etwas unternehmen. (Benutzer auffordern? Automatisch übernehmen? Zurücksetzen?)

Ich sehe, wie man den aktuellen Gegenstand bekommt, und kann den Delegierten für diesen Gegenstand bekommen, aber ich sehe keine %code% Eigenschaft, die ich hoffte zu finden.

Kann mir jemand in die richtige Richtung zeigen?

    
___ answer18510433 ___

Sie können %code% ableiten, um auf die Funktion %code% zugreifen zu können, die leider geschützt ist. Allerdings habe ich das nicht versucht.

Wenn Sie bereits eine Unterklasse %code% haben, können Sie mit ihr verfolgen, ob ein Editor gerade geöffnet ist. Sie können jedoch nicht %code% / %code% verwenden, da %code% nicht aufgerufen wird, wenn der Benutzer die Bearbeitung abbricht. Stattdessen können Sie die Erstellung und die Zerstörung des Editors selbst verfolgen.

%Vor%

Implementierung:

%Vor%

Bei einigen Gelegenheiten, z.B. Wenn Sie mit den Cursortasten zum nächsten Element im Baum gehen, erstellt Qt zuerst den neuen Editor und dann den alten. Daher muss %code% eine ganze Zahl anstelle von bool sein.

Leider ist %code% eine %code% -Funktion. Daher können Sie kein %code% -Member erstellen. Erstellen Sie stattdessen einen Zeiger auf ein %code% und verwenden Sie das.

    
___ answer41406827 ___

Wenn Sie den Index des bearbeiteten Elements kennen, können Sie %code% aufrufen und versuchen, ihn zu konvertieren. Wenn es gültig ist, wissen Sie nicht nur, dass Sie gerade bearbeiten, sondern auch Ihr Editor-Widget zur Hand haben.

%Vor%     
___ tag123qt ___ Qt ist ein plattformübergreifendes Anwendungsentwicklungs-Framework, das häufig für die Entwicklung von Anwendungssoftware verwendet wird, die auf verschiedenen Software- und Hardwareplattformen ohne oder mit nur geringer Änderung der zugrundeliegenden Codebasis ausgeführt werden kann. Qt ist sowohl mit kommerziellen als auch mit Open-Source-Lizenzen verfügbar. ___ answer39382194 ___

Hier ist eine Idee, es ist sogar hilfreich, das Edit / Combo-Widget zu erhalten, bevor die Bearbeitung beginnt ...

geben nur ein Signal aus und konsumieren es im Hauptfenster ... das ist es, was ich benutzt habe, um ein Kombinationsfeld in QTableWidget zu bekommen, bevor ich es bearbeite ...

Erstellen Sie zuerst ein Signal in ComoBoxItemDelegate ...

%Vor%

gibt dann das Signal in der createEditor-Methode aus ...

%Vor%

und im MainWindow eine Funktion deklarieren, um das Singal zu empfangen ...

%Vor%

Dann schließe es endlich im Konstruktor von MainWindow an ...

%Vor%     
___ tag123qtableview ___ QTableView ist eine Qt-Klasse, die eine Standardmodell- / View-Implementierung einer Tabellenansicht bereitstellt. ___ qstnhdr ___ Ermitteln Sie, ob QTableView einen offenen Editor hat ___ answer13818357 ___

Verbinden Sie sich mit dem zugrunde liegenden Modell dataChanged Signal

%Vor%

Sie können prüfen, ob die Zelle, in der sich die Daten geändert haben, mit dem currentIndex

übereinstimmt %Vor%

Sie können nicht wissen, ob die aktuelle Zelle einen offenen Editor gerade hat, aber Sie können überprüfen, ob die Ansicht in QAbstractItemView :: EditingState

ist %Vor%

Es sollte ausreichen, um zu tun, was Sie wollen.

    
___
wedesoft 13.03.2014 14:04
quelle
3

Verbinden Sie sich mit dem zugrunde liegenden Modell dataChanged Signal

%Vor%

Sie können prüfen, ob die Zelle, in der sich die Daten geändert haben, mit dem currentIndex

übereinstimmt %Vor%

Sie können nicht wissen, ob die aktuelle Zelle einen offenen Editor gerade hat, aber Sie können überprüfen, ob die Ansicht in QAbstractItemView :: EditingState

ist %Vor%

Es sollte ausreichen, um zu tun, was Sie wollen.

    
Trompa 11.12.2012 10:32
quelle
2

Sie können QTableView ableiten, um auf die Funktion state() zugreifen zu können, die leider geschützt ist. Allerdings habe ich das nicht versucht.

Wenn Sie bereits eine Unterklasse QStyledItemDelegate haben, können Sie mit ihr verfolgen, ob ein Editor gerade geöffnet ist. Sie können jedoch nicht setEditorData / setModelData verwenden, da setModelData nicht aufgerufen wird, wenn der Benutzer die Bearbeitung abbricht. Stattdessen können Sie die Erstellung und die Zerstörung des Editors selbst verfolgen.

%Vor%

Implementierung:

%Vor%

Bei einigen Gelegenheiten, z.B. Wenn Sie mit den Cursortasten zum nächsten Element im Baum gehen, erstellt Qt zuerst den neuen Editor und dann den alten. Daher muss m_editorCount eine ganze Zahl anstelle von bool sein.

Leider ist createEditor() eine const -Funktion. Daher können Sie kein int -Member erstellen. Erstellen Sie stattdessen einen Zeiger auf ein int und verwenden Sie das.

    
Florian Kusche 29.08.2013 12:01
quelle
1

Wenn Sie den Index des bearbeiteten Elements kennen, können Sie indexWidget() aufrufen und versuchen, ihn zu konvertieren. Wenn es gültig ist, wissen Sie nicht nur, dass Sie gerade bearbeiten, sondern auch Ihr Editor-Widget zur Hand haben.

%Vor%     
mrg95 31.12.2016 08:45
quelle
0

Hier ist eine Idee, es ist sogar hilfreich, das Edit / Combo-Widget zu erhalten, bevor die Bearbeitung beginnt ...

geben nur ein Signal aus und konsumieren es im Hauptfenster ... das ist es, was ich benutzt habe, um ein Kombinationsfeld in QTableWidget zu bekommen, bevor ich es bearbeite ...

Erstellen Sie zuerst ein Signal in ComoBoxItemDelegate ...

%Vor%

gibt dann das Signal in der createEditor-Methode aus ...

%Vor%

und im MainWindow eine Funktion deklarieren, um das Singal zu empfangen ...

%Vor%

Dann schließe es endlich im Konstruktor von MainWindow an ...

%Vor%     
Ooty 08.09.2016 03:34
quelle

Tags und Links