Qt:使用QStandardItemModel在QTableView中创建一个QItemDelegate以使用自定义编辑器(组合框)

时间:2012-03-12 17:48:44

标签: qt qtableview qitemdelegate qstandarditemmodel

我需要在Qt中实现一个表,该表在特定列的每一行上显示一个组合框。

到目前为止基于这个例子: http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.html 在这个问题上: QStandardItem + QComboBox 我成功地设法创建了一个QItemDelegate。

我的问题是,如果我从main.cpp中的main()函数实现它,一切正常,但如果我在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上的委托(它显示了表格但是当我双击第二列时它没有显示组合框。而是显示常规的Spin Box):

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 个答案:

答案 0 :(得分:4)

假设在两个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);