3

実行時に、次のように QTreeWidget に QCombobox を挿入しました。

    //global defines
    #define COLUMN_1 (0)
    #define COLUMN_2 (1)

    //Init QComboBox to QTreeWidget - works fine.
    QTreeWidgetItem *item = new QTreeWidgetItem(_myTreeWidget);
    item->setText(COLUMN_1,"testing");

    QComboBox *box = new QComboBox();

    box->addItem("select1");
    box->addItem("select2");
    box->addItem("select3");

    _myTreeWidget->setItemWidget(item, 1, box);

上記のコードは機能しますが、これらの列のデータ テキストも読みたいと思います。例えば。上記のコードから文字列「testing」と「select2」を取得します。問題は、コンボボックスで「QComboBox::currentText()」を読み取る方法がわからないことです。私が試してみました:

   QTreeWidgetItemIterator it(_myTreeWidget);
   while(*it)
   {
      QTreeWidgetItem *item = *it;

      QVariant first   = item->text(COLUMN_1);
      QString firstStr = loggerName.toString();  //this works

      QComboBox *box    = (QComboBox*)item->data(COLUMN_2, 0);   
      QString boxValStr = box->text().toString();   //this doesn't works, always empty string

      //... more code to handle strings... 

      it++;
   }

「item->data(COLUMN_2, 0)」は QVariant を返すため、間違った方法のように感じます。この問題の解決策は?

4

4 に答える 4

5

QComboBox *box = (QComboBox*)item->data(COLUMN_2, 0); このコードを読んだとき、私はパニックモードに入りました。署名を見てください:

QVariant QTreeWidgetItem::data ( int column, int role ) const

あなたが使用したようsetItemWidgetに、あなたはおそらく使用する必要があります

QWidget * QTreeWidget::itemWidget ( QTreeWidgetItem * item, int column ) const

ps:キャストする場合は、C++キャストを使用します。はるかに良い、に使用qobject_cast<SubtypeofQObjectPtr>QObjectます。キャストが無効な場合はnullを返します。

実際、次のような呼び出しを使用してコンボボックスを取得することを意味します。

QComboBox* box = qobject_cast<QComboBox*>(treeWidget->itemWidget(item, column));
于 2013-01-07T13:22:58.503 に答える
3

上記の@Umnyobeと@Zaiborgの助けを借りて解決しました。全体的な実例は次のとおりです。

列1にテキスト、列2にQComboBoxを使用してQTreeWidgetを初期化します。

//global defines
#define COLUMN_1 (0)
#define COLUMN_2 (1)

QTreeWidgetItem *item = new QTreeWidgetItem(_myTreeWidgetPtr);//item to put in tree
item->setText(COLUMN_1,"animal");                             //item for column 1 in the tree.

QComboBox *box = new QComboBox();
box->addItem("mouse");                                        //adds selections for comboboxes
box->addItem("cat");
box->addItem("dog");

_myTreeWidgetPtr->setItemWidget(item, COLUMN_2, box);           //insert items in tree.

ツリーから値を読み取ります。

QTreeWidgetItemIterator it(_myTreeWidgetPtr);
while(*it)
{
    QTreeWidgetItem *item = *it;

    //Init pointer to current combobox
    QComboBox* box = qobject_cast<QComboBox*>(_myTreeWidgetPtr->itemWidget(item, COLUMN_2)); 

    //Get data from QTreeWidget
    QString col1Str = item->text(COLUMN_LOGGER);   
    QString col2Str = box->currentText();

    it++;
}

それが誰かを助けることができることを願っています:)

于 2013-01-09T17:30:22.493 に答える
0

Python ソリューション (QTreeWidget の PySide / PyQt QComboBox) を探している人は、次のとおりです。

    item = QTreeWidgetItem(self.treeWidgetAnimals)
    item.setText(0, "animal")
    combo_box = QComboBox()
    combo_box.addItem('mouse')
    combo_box.addItem('cat')
    combo_box.addItem('dog')
    self.treeWidgetAnimals.setItemWidget(item, 1, combo_box)

私は何時間も探していましたが、「委任」のようなパス参照「親」のような他のフォーラムはありませんでした:

        item = QTreeWidgetItem (self.myTreeWidgetItemObject)

親を渡さない場合、エラーは返されませんが、ComboBox は表示 TreeWidget に表示されません。

于 2013-02-23T22:05:45.257 に答える
0

このクラスを使用してQSignalMapper、ツリー ウィジェット内のさまざまなボックスを収集します。

次に、QSignalMapper::mapped()信号をスロットに接続し、コンボボックスを使用します

編集:

QSignalMapper* mapper = new QSignalMapper(this);
QComboBox *box = new QComboBox();   
connect( box, SLOT(/*whatever*/), mapper, SLOT( map() ) );
mapper->setMapping( box );
myTreeWidget->setItemWidget(item, 1, comboBox);
于 2013-01-07T13:20:17.900 に答える