2012-03-12 23 views
1

特定の列の各行にコンボボックスを表示するテーブルをQtに実装する必要があります。 http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.html と、この質問に:Qt:QStandardItemModelでQTableViewにカスタムエディタ(コンボボックス)を作成するQItemDelegateを作成します。

は、これまでのところ、この例に基づいて QStandardItem + QComboBox 私は正常にQItemDelegateを作成するために管理しました。

私の問題はmain.cppのmain()関数から実装するとすべて正常に動作しますが、Maintextクラスの関数内で使用するためにQt Designerにテーブルを挿入するとうまく動作しませんin 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の(それは示していmainwindow.cpp代替2の空のテーブル)

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

代表団(それがテーブルを示すが、私は2番目の列をダブルクリックしたときに、それはトンが表示されません彼はコンボボックス。その代わりに、通常のスピンボックス)を示しています。両方mainwindow.cppの例では、あなたが表示されたコードは、コンストラクタでは、あなたがあると仮定すると

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

の古典の「JavaやPython、Perlや任意の言語から来ますヒープ上ではなく、モデルや代理人をスタックに割り当てるためのメモリ管理についての気にしないエラーがあります。

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

ボトムライン:ケース3のために、やるComboBoxDelegate* delegate = new ComboBoxDelegate();ui->tablePoint->setItemDelegateForColumn(1,delegate);

+0

はあなたにKoyingをありがとう!あなたは問題が何であるかを認識してプログラムを修正していることを知っています。しかし、私は100時間未満の評判しかないので、8時間前に私自身の質問に答えることができませんでした。 私がこの間違いを犯すのは初めてではなく、それは最後ではないと信じています。あなたは正しいです、私は非オブジェクト指向のプログラミング世界から来て、これらの種類のものは私のための***の痛みです。私とあなたの知識を共有してくれてありがとう。ご挨拶フランシスコ – Fracu

関連する問題