0

QComboBox特定の列の各行にを表示するテーブルを Qt に実装する必要があります。

この質問に基づいて: 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 ランタイム関数に渡されました」というメッセージが表示されます。

4

1 に答える 1

2

私の問題は、モデルに行を追加する前に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);

これで問題は解決しました。

皆さん、ありがとうございました。

于 2012-03-17T22:21:42.333 に答える