2009-02-05 12 views
5

Ich zeige ein Popup-Menü, um einige Werte in einem QTableWidget auszuwählen. Das niedrigste Element ist ein "Modify list" -Eintrag. Wenn ich es auswähle, sollte automatisch ein neues Fenster erscheinen und die QComboBox sollte verschwinden und die Zelle kehrt in einen Qt :: DisplayRole-Zustand zurück.Wie kann ich einem QTableWidget mitteilen, die Bearbeitung einer Zelle zu beenden?

Jetzt Qt hat all die schönen API-Aufrufe wie QTableWidget.edit() und QTableWidget.editItem(), was ich suche wirklich für ein QTableWidget.endEditing(), vorzugsweise ohne den Index der Zelle zu spezifizieren, obwohl ich, dass mit diesem Anruf bekommen könnte:

table.currentIndex() 

... aber ich weiß nicht, ob ich garantieren kann, dass die aktuelle Zelle die Zelle ist, die ständig bearbeitet wird.

Gibt es eine API, um diese Art von Editoren zu schließen?

Popup menu

Antwort

7

QTableWidget erbt 19 öffentlichen Schlitze von QWidget. Eine davon ist setDisabled(), die Eingabeereignisse für dieses Widget und alle untergeordneten Elemente deaktivieren soll.

Ich würde versuchen:

table.setDisabled(true); 
table.setDisabled(false); 

Obwohl Sie sagte, dass es bei Ihnen nicht funktioniert, gibt es eine alternative Methode: Wenn Sie das nicht mögen (die Tabelle den Fokus verliert, glaube ich), Sie kann versuchen, EditTriggers zu verwenden. Zum Beispiel:

table.setEditTriggers(QAbstractItemView::NoEditTriggers); 
+0

Ihr der erste hat funktioniert, der zweite nicht. Es spielt keine Rolle, dass es den Fokus verliert, weil ich einen modalen Dialog zeige. Ich werde diese Antwort als richtig bezeichnen, wenn niemand eine natürlichere Lösung vorschlagen wird. –

+0

Ich habe gerade ein Beispiel gestartet, um EditTriggers zu testen, und es scheint zu funktionieren (C++, Qt 4.4.3). Ich kann auf jede Zelle und so klicken, aber ich kann nicht auf sie klicken, um sie zu bearbeiten oder irgendetwas. Ich weiß nicht, warum es nicht für dich funktioniert. * Achselzucken * –

+0

Es geht darum, den Editor zu schließen, nicht in der Lage, es zu bearbeiten. Beim nächsten Doppelklick sollte der Editor wieder geöffnet werden. –

1

Unter Umständen können Sie QTableWidget.closePersistentEditor() verwenden, um den Editor zu schließen. QAbstractItemView.closeEditor() liegt jedoch möglicherweise näher bei dem, was Sie möchten, insbesondere da Sie mit der QModelIndex-basierten API vertraut zu sein scheinen und bereits ein benutzerdefiniertes Editor-Widget verwenden.

2

table.setCurrentItem(None) ist, was für mich arbeitete. (Vergessen Sie nicht, Signale zu blockieren, wenn Sie eine cellChanged/itemChanged-Slot-Funktion verwenden.)

Dies ist mit PyQt. Für C++ denke ich, ersetzen Sie None mit NULL.

0

Ich kann nicht für Listenwidgets sprechen. Aber ich habe hier versucht, etwas Ähnliches zu tun.

Ich habe auf eine Zelle doppelgeklickt, und basierend auf der Spalte, ein Unterformular mit einer Liste, dann, wenn das geschlossen war, bewegen Sie zur nächsten passenden Spalte basierend auf dem ausgewählten Wert.

Mein Problem war, dass ich den Wert in der Zelle abrufen und die nächste geeignete Zelle auswählen konnte, aber die ursprüngliche Zelle blieb im Bearbeitungsmodus ausgewählt!

Endlich dämmerte es mir, dass mein Doppelklick die Zelle ausgewählt hatte, d. Bearbeitung.

Ein einfacher Klick wählt die Zelle aus, öffnet jedoch keinen Bearbeitungsmodus.

Randbemerkung: Niemals, dass Unterform bekommen könnte wirklich modal zu handeln, so habe ich eine Schleife in der anrufenden Form: Während die Unterform sichtbar war, mit dem einzigen Code ist app.processEvents()

Verwandte Themen