我需要在Qt中實現一個表,在特定列的每一行上顯示一個QComboBox。Qt,QStandarItemModel:自定義QComboBox上的委託項目,從模型的實例化器中填充它的內容。
基於這個問題:QStandardItem + QComboBox我成功地設法創建了一個QItemDelegate。在那個例子中,QComboBox的內容是在ComboBoxDelegate類上靜態定義的,但在我的情況下,我需要在創建QStandardItemModel的函數中定義QComboBox的內容。
void MainWindow::fooHandler() {
QStandardItemModel* mymodel = new QStandardItemModel;
ui->tablePoint->setModel(mymodel);
ComboBoxDelegate* delegate=new ComboBoxDelegate;
ui->tablePoint->setItemDelegateForColumn(2,delegate);
QStringList Pets;
Pets.append("cat");
Pets.append("dog");
Pets.append("parrot");
// So far this is how I tried to store data under Qt::UserRole in "mymodel":
QModelIndex idx = mymodel->index(0, 2, QModelIndex());
mymodel->setData(idx,QVariant::fromValue(Pets), Qt::UserRole);
//Now i fill the table with some values...
QList< QStandardItem * > items;
items.clear();
items << new QStandardItem("col0");
items << new QStandardItem("col1");
items << new QStandardItem("parrot");
items << new QStandardItem("col3");
mymodel->appendRow(items);
items.clear();
items << new QStandardItem("col0");
items << new QStandardItem("col1");
items << new QStandardItem("cat");
items << new QStandardItem("col3");
mymodel->appendRow(items);
}
然後,我應該能夠從委託類收回組合框的內容:
void ComboBoxDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QComboBox *cBox = static_cast<QComboBox*>(editor);
if(index.column()==2) {
QModelIndex idx = index.model()->index(0, 2, QModelIndex());
cBox->addItem(index.model()->data(idx,Qt::UserRole).toStringList().at(0));
cBox->addItem(index.model()->data(idx,Qt::UserRole).toStringList().at(1));
cBox->addItem(index.model()->data(idx,Qt::UserRole).toStringList().at(2));
}
cBox->setCurrentIndex(cBox->findText(value));
}
該項目編譯好,但是我
該模型是一個MainWindow類方法中定義點擊一個單元格來改變程序崩潰的QComboBox值,並且我得到了一個「傳遞給C運行時函數的無效參數」。
我感覺莫名其妙,這個問題也許是一個愚蠢的錯誤,但因爲我是盲人,並堅持在這裏相當長的時間,我真的apprecciate您在本幫助...
您能給我有一些建議?
在此先感謝您的閱讀!