Qt,QStandarItemModel:自定义QComboBox上的委托项从模型的实例化器填充其内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt,QStandarItemModel:自定义QComboBox上的委托项从模型的实例化器填充其内容相关的知识,希望对你有一定的参考价值。

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

基于这个问题:QStandardItem + QComboBox我成功地创造了一个QItemDelegate。在该示例中,QComboBox内容在ComboBoxDelegate类上静态定义,但在我的情况下,我需要在创建QComboBox的函数中定义QStandardItemModel内容。

该模型在MainWindow类方法中定义:

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

然后我应该能够从委托类中恢复ComboBox内容:

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

该项目编译得很好但是当我单击一个单元格来更改QComboBox值时,程序崩溃了,我得到了一个“无效参数传递给C运行时函数”。

答案

我的问题是我在将行追加到模型之前尝试使用mymodel-> setdata()。

所以,如果一开始我应该这样做:

QList< QStandardItem * > items;
items.clear();
items << new QStandardItem("col0");
items << new QStandardItem("col1");
items << new QStandardItem("parrot");
items << new QStandardItem("col3");
mymodel->appendRow(items);

然后......

QModelIndex idx = mymodel->index(0, 2, QModelIndex());
mymodel->setData(idx,QVariant::fromValue(Pets), Qt::UserRole);

这解决了这个问题。

谢谢你们。

以上是关于Qt,QStandarItemModel:自定义QComboBox上的委托项从模型的实例化器填充其内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在Qt中使用自定义数据类型

如何将 Qt 属性与自定义类一起使用?

QT: 自定义断言;

Qt 中自定义小部件的自定义样式

QT 自定义处理调试信息

Qt Designer 使用自定义插件崩溃