【问题标题】:Qt, QStandarItemModel: Delegation items on custom QComboBox filling its contents from instantiator of modelQt,QStdarItemModel:自定义 QComboBox 上的委托项,从模型的实例化器填充其内容
【发布时间】:2012-03-16 20:10:17
【问题描述】:

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

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

模型在 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 运行时函数的无效参数”。

【问题讨论】:

    标签: qt qabstractitemmodel qvariant qstandarditemmodel


    【解决方案1】:

    我的问题是我在将行附加到模型之前尝试使用 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);
    

    这解决了问题。

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 2014-03-20
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多