Qt: Создайте QItemDelegate, чтобы иметь собственный редактор (поля со списком) в QTableView с QStandardItemModel - PullRequest
1 голос
/ 12 марта 2012

Мне нужно реализовать таблицу в Qt, которая показывает поле со списком для каждой строки в определенном столбце.

Пока что на основе этого примера: http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.html и по этому вопросу: QStandardItem + QComboBox Мне удалось создать QItemDelegate.

Моя проблема в том, что все работает нормально, если я реализую это из моей функции main () в main.cpp, но это не работает, если я вставляю таблицу в Qt Designer, чтобы затем использовать ее в функцииКласс MainWindow в mainwindow.cpp.

Не могли бы вы дать мне подсказку?Заранее спасибо!

Делегирование на main.cpp (работает хорошо, когда я дважды щелкаю по второму столбцу, появляется поле со списком):

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

Делегирование на mainwindow.cpp, альтернатива 1 (показывает пустую таблицу)

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

Делегирование на mainwindow.cpp, альтернатива 2 (показывает таблицу, но когда я дважды щелкаю наво втором столбце не отображается поле со списком. Вместо него отображается обычное поле прокрутки):

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

1 Ответ

4 голосов
/ 13 марта 2012

Предполагая, что в обоих случаях mainwindow.cpp код, который вы показываете, находится в конструкторе, вы делаете классическую ошибку "исходящий из Java, Python, Perl или любого языка, в которой вам наплевать на управление памятью" выделить вашу модель и / или делегировать в стеке, а не в куче.

В c ++ материал, выделенный в стеке (например, QStandardItemModel model(4,2);), уничтожается при возврате из функции, в то время как материал, выделенный в куче (например, QStandardItemModel* model = new QStandardItemModel(4,2);, живет до тех пор, пока вы delete не сохранят его). Случай 1 работает, потому что материал, размещенный в стеке в main(), живет в течение всего приложения.

Итог: для случая 3 выполните ComboBoxDelegate* delegate = new ComboBoxDelegate(); и ui->tablePoint->setItemDelegateForColumn(1,delegate);

...