2016-08-05 42 views
0

Ich habe bereits eine Baummodellansicht, die Spalten mit einer Beschriftung, Textbearbeitung und einer Prüfschaltfläche enthält. Was ich hinzufügen möchte, ist ein Druckknopf. Hier ist, wo ich bin stecken:QPushButtons in einer Spalte einer Treeview

  1. In der „Flags“ Funktion, die Namespace verwendet werden?
  2. In der "Daten" -Funktion, was wäre die Rolle des Druckknopfes? (zum Beispiel in der Check-Button-Fall habe ich die Qt::CheckStateRole)
  3. In der "Daten" -Funktion (die eine QVariant zurückgibt) was soll ich zurück? Die Schaltfläche erstellt?

Ich habe andere Antworten zu diesem Thema und die beliebteste Antwort mit einem setIndexWidget vorgeschlagen, aber ich bin mir nicht sicher, wie. Letzte Anmerkung: Ich versuche dies programmgesteuert zu tun, ohne den UI-Designer zu verwenden.

Vielen Dank!

Antwort

0

Vor allem anderen scheinen Sie etwas verwirrt darüber zu sein, wie Qt's Model/View Framework funktioniert. Ich schlage vor, Sie Qt Dokumentation darüber gehen überprüfen: http://doc.qt.io/qt-5/model-view-programming.html

die Antworten auf Ihre Fragen 3:

  1. Sie müssen keine Namensräume in Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const verwenden. Geben Sie einfach die bestimmte Qt::ItemFlags (d. H. Kombination von Qt::ItemFlag) zurück, die Ihrem Index entspricht. Das hat nichts damit zu tun, dass Sie aus Ihrer Sicht eine QPushButton wollen. Ich denke, Sie sind durch das Flag Qt::ItemIsUserCheckable verwirrt, die die Ansicht ein Kontrollkästchen aktivieren. Dies ist jedoch nicht das, was dieses Flag wirklich tut, sondern es teilt dem Benutzer lediglich mit, dass er einen Mittelwert für den Benutzer angeben soll, um die Qt::CheckStateRole des Indexes zu ändern. Das Standardverhalten der Ansicht besteht darin, eine QCheckBox anzuzeigen.

  2. Mit den Drucktasten sind keine Rollen verknüpft. Sie können Qt::CheckStateRole oder Qt::EditRole verwenden, es hängt von der Methode ab, die Sie auswählen, um die QPushButton anzuzeigen.

  3. In QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const, wenn role ist Qt::CheckStateRole oder Qt::EditRole Sie eine boolean zurückgeben kann, die den Zustand des QPushButton kontrollieren. Sie sollten jedoch NIEMALS eine QWidget zurückgeben (oder abgeleitet), das Modell behandelt Daten, nicht wie sie angezeigt werden.

Eine Lösung: reimplementieren QAbstractItemDelegate (oder QStyledItemDelegate). Rewrite:

  • createEditor(): Erstellen Sie eine QPushButton.
  • setEditorData(): Setzen Sie den QPushButton -Status mithilfe des Index und der Rolle, die Sie in QAstractItemModel::data() verwendet haben.
  • setModelData(): Aktualisieren Sie das Modell gemäß dem QPushButton Zustand.

Legen Sie Ihren Delegaten auf Ihre Sicht (QTreeView::setItemDelegateForColumn()).An dieser Stelle erhalten Sie nur in der Edition einen Druckknopf. Sie können dann QAbstractItemView::openPersistentEditor() anrufen, um es immer sichtbar zu machen.

+0

Da Sie erwähnt haben, dass ich das QAbstractItemModel verwenden sollte, wäre ich in der Lage, es zu implementieren, ohne mein aktuelles MTreeModel neu zu schreiben? –

+0

QAbstractItemModel ist die Basisklasse für alle Modellklassen, daher bin ich mir ziemlich sicher, dass Ihr MTreeModel QAbstractItemModel erbt und daher alles, was ich für QAbstractItemModel gesagt habe, auch für MTreeModel gilt. –

+0

Danke, ich denke, ich habe jetzt ein besseres Verständnis. Ich bin mir nicht ganz sicher, was das Problem in diesem Fehler ist, den ich empfange: Rückgabewert entspricht nicht dem Funktionstyp QWidget colorDelegate :: * createEditor (QWidget * übergeordnetes, const QStyleOptionViewItem & option, const QModelIndex & index) { \t QPushButton * button = neue QPushButton (const_cast (Eltern)); \t button-> setText ("Push"); \t Rücktaste; } –