Qt:Erstellen Sie ein QItemDelegate, um einen benutzerdefinierten Editor (Kombinationsfelder) in einer QTableView mit QStandardItemModel zu haben

StackOverflow https://stackoverflow.com//questions/9672158

Frage

Ich muss eine Tabelle in Qt implementieren, die in jeder Zeile einer bestimmten Spalte ein Kombinationsfeld anzeigt.

Bisher basierend auf diesem Beispiel:http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.html und zu dieser Frage:QStandardItem + QComboBox Ich habe es erfolgreich geschafft, ein QItemDelegate zu erstellen.

Mein Problem ist, dass alles gut funktioniert, wenn ich es von meiner main () -Funktion in main implementiere.cpp, aber es funktioniert nicht gut, wenn ich die Tabelle in Qt Designer einfüge, um sie dann innerhalb einer Funktion der MainWindow-Klasse in mainwindow zu verwenden.kpp.

Könnten Sie mir bitte einen Hinweis geben?Danke im Voraus!

Delegation am Main.cpp (es funktioniert gut, wenn ich auf die zweite Spalte doppelklicke, wird ein Kombinationsfeld angezeigt.):

QStandardItemModel model(4, 2);
QTableView tableView;
tableView.setModel(&model);
ComboBoxDelegate delegate;
tableView.setItemDelegateForColumn(1,&delegate);
tableView.horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model.index(row, col, QModelIndex());
        model.setData(index, QVariant((row+1) * (col+1)));
    }
}
tableView.show();

Delegation im Hauptfenster.cpp Alternative 1 (es zeigt eine leere Tabelle)

QStandardItemModel model(4,2);
ui->tablePoint->setModel(&model);
ComboBoxDelegate delegate;
ui->tablePoint->setItemDelegateForColumn(1,&delegate);
ui->tablePoint->horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model.index(row, col, QModelIndex());
        model.setData(index, QVariant((row+1) * (col+1)));
    }
}

Delegation im Hauptfenster.cpp-Alternative 2 (es zeigt die Tabelle, aber wenn ich auf die zweite Spalte doppelklicke, wird das Kombinationsfeld nicht angezeigt.Stattdessen wird das reguläre Drehfeld angezeigt.):

QStandardItemModel* model = new QStandardItemModel(4,2);
ui->tablePoint->setModel(model);
ComboBoxDelegate delegate;
ui->tablePoint->setItemDelegateForColumn(1,&delegate);
ui->tablePoint->horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model->index(row, col, QModelIndex());
        model->setData(index, QVariant((row+1) * (col+1)));
    }
}
War es hilfreich?

Lösung

Angenommen, das in beiden Hauptfenstern.in cpp-Fällen befindet sich der Code, den Sie anzeigen, im Konstruktor. Sie führen den klassischen Fehler "aus Java, Python, Perl oder einer anderen Sprache, in der Sie sich nicht um die Speicherverwaltung kümmern" aus, um Ihr Modell und / oder Ihren Delegaten zuzuweisen der Stapel und nicht auf dem Heap.

In c ++ werden auf dem Stapel zugewiesene Sachen (z. QStandardItemModel model(4,2);) wird bei der Rückkehr von der Funktion zerstört, während auf dem Heap zugewiesenes Material (z. QStandardItemModel* model = new QStandardItemModel(4,2); lebt bis du delete es).Fall 1 funktioniert, weil Sachen auf dem Stapel in zugewiesen sind main() lebt für die Dauer der App.

Endergebnis:führen Sie für Fall 3 eine ComboBoxDelegate* delegate = new ComboBoxDelegate(); und ui->tablePoint->setItemDelegateForColumn(1,delegate);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top