QT: Crea un QitemDelegate per avere un editor personalizzato (caselle combinate) in un QTAbleView con QSTANDARDITEMMODEL

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

Domanda

Ho bisogno di implementare una tabella in Qt che mostra una casella combinata su ogni riga su una particolare colonna.

Finora in base a questo esempio: http://doc.qt.nokia.com/4.7-snapshot/ ItemViews-spinboxDelegate.html e su questa domanda: qdndarditem + qcombobox Sono riuscito con successo per creare un qitemdelegate.

Il mio problema è che tutto funziona bene se lo impleggo dalla mia funzione principale () in main.cpp, ma non funziona bene se inserisco la tabella in Qt Designer per usarlo, quindi in una funzione della classe MainWindow in mainwindow.cpp.

Potresti per favore darmi un indizio? Grazie in anticipo!

Delegazione su Main.Cpp (funziona bene, quando faccio doppio clic sulla seconda colonna mostra una casella combinata):

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();
.

Delegazione su MainWindow.cpp Alternative 1 (Mostra un tavolo vuoto)

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)));
    }
}
.

Delegazione su MainWindow.Cpp Alternative 2 (mostra la tabella ma quando faccio doppio clic sulla seconda colonna non mostra la casella combinata. Invece mostra la regolazione della rotazione regolare): .

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)));
    }
}
.

È stato utile?

Soluzione

Supponendo che sia nei casi MainWindow.Cpp, il codice che mostri è nel costruttore, fai il classico "proveniente da Java, Python, Perl o qualsiasi linguaggio in cui non si dà una dannazione dell'errore di gestione della memoria" aAssegna il tuo modello e / o delegato sullo stack piuttosto che sul mucchio.

In C ++, il materiale assegnato sullo stack (ad esempio QStandardItemModel model(4,2);) viene distrutto al momento della restituzione dalla funzione, mentre i roba assegnati sul mucchio (ad esempio QStandardItemModel* model = new QStandardItemModel(4,2); vivono fino a quando non è delete). Caso 1 funziona perché roba assegnati sullo stack in generazione main() vive per la durata dell'app.

Bottom line: per caso 3, eseguire un ComboBoxDelegate* delegate = new ComboBoxDelegate(); e ui->tablePoint->setItemDelegateForColumn(1,delegate);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top