1

特定の列の各行にコンボ ボックスを表示するテーブルを Qt に実装する必要があります。

これまでのところ、この例に基づいています: http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.html およびこの質問: QStandardItem + QComboBox QItemDelegate を作成することに成功しました。

私の問題は、main.cpp の main() 関数から実装するとすべて正常に動作することですが、Qt Designer にテーブルを挿入して mainwindow.cpp の MainWindow クラスの関数内で使用するとうまく動作しません。 .

手がかりを教えてください。前もって感謝します!

main.cpp の委任 (2 番目の列をダブルクリックすると、コンボ ボックスが表示されます):

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 の委任 (表は表示されますが、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)));
    }
}
4

1 に答える 1

4

両方のmainwindow.cppの場合で、表示するコードがコンストラクターにあると仮定すると、モデルを割り当てるために、古典的な「java、python、perl、またはメモリ管理について気にしない言語から来る」エラーを実行します。および/またはヒープではなくスタックで委任します。

C ++では、スタックに割り当てられたもの(eg QStandardItemModel model(4,2);)は関数から戻るときに破棄されますが、ヒープに割り当てられたもの(eg)はQStandardItemModel* model = new QStandardItemModel(4,2);あなたがそれまで存続しますdelete。ケース1が機能するmain()のは、アプリの存続期間中、スタックに割り当てられたものが有効であるためです。

結論:ケース3の場合、aComboBoxDelegate* delegate = new ComboBoxDelegate();ui->tablePoint->setItemDelegateForColumn(1,delegate);

于 2012-03-13T01:13:10.263 に答える