【问题标题】:Qt: Create a QItemDelegate to have a custom editor (Combo Boxes) in a QTableView with QStandardItemModelQt:创建一个 QItemDelegate 以在带有 QStandardItemModel 的 QTableView 中有一个自定义编辑器(组合框)
【发布时间】:2012-03-12 17:48:43
【问题描述】:

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

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

我的问题是,如果我从 main.cpp 中的 main() 函数实现它,一切正常,但如果我在 Qt Designer 中插入表以使用它,然后在 MainWindow 类的函数中使用它,它就不能正常工作主窗口.cpp。

你能给我一个线索吗?提前致谢!

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

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

【问题讨论】:

    标签: qt qtableview qitemdelegate qstandarditemmodel


    【解决方案1】:

    假设在两种 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-&gt;tablePoint-&gt;setItemDelegateForColumn(1,delegate);

    【讨论】:

    • 谢谢科英!你知道我意识到了问题所在并修复了程序。但由于我的声望低于 100,我无法在 8 小时前回答我自己的问题。这不是我第一次犯这个错误,我相信也不会是最后一次。你是对的,我来自一个非面向对象的编程世界,这些事情对我来说是一种痛苦。谢谢你跟我分享你的知识。问候。弗朗西斯科
    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多