【问题标题】:QComboBox inside QTreeWidgetItemQTreeWidgetItem 内的 QComboBox
【发布时间】:2010-12-12 16:00:17
【问题描述】:

有没有类似于 (PyQT) 的东西 QTreeWidgetItem.setCheckState(0, Qt.Checked) 但是对于组合框?

我在参考中看不到任何内容,那么如何插入自定义 QComboBox 作为 QTreeWidgetItem 中的元素之一?

【问题讨论】:

    标签: qt pyqt pyqt4 qt4


    【解决方案1】:

    使用QTreeWidget::setItemWidget ( QTreeWidgetItem * item, int column, QWidget * widget ) 将组合框放入单元格中。

    例如,让我们将 2 列 QTreeWidget 的第二列的所有行都设为组合框:

    QTreeWidgetItemIterator it(ui->treeWidget);
    while (*it) {
        QComboBox *comboBox = new QComboBox(this);
        comboBox->addItems(QStringList() << "item1" << "item2");
        ui->treeWidget->setItemWidget(*it, 1, comboBox);
        ++it;
    }
    

    我们的示例小部件现在看起来像这样:

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题,但我想我有一个更彻底的答案。要从 QComboBox 中获取任何功能,您可能需要对其进行子类化。这是我想出的解决方案:

      
      #ifndef COMBOBOXITEM_H
      #define COMBOBOXITEM_H
      
      #include 
      
      class ComboBoxItem : public QComboBox
      {
          Q_OBJECT
      
      private:
          QTreeWidgetItem *item;
          int column;
      
      public:
          ComboBoxItem(QTreeWidgetItem*, int);
      
      public slots:
          void changeItem(int);
      
      };
      
      ComboBoxItem::ComboBoxItem(QTreeWidgetItem *item, int column)
      {
          this->item = item;
          this->column = column;
          connect(this, SIGNAL(currentIndexChanged(int)), SLOT(changeItem(int)));
      }
      
      void ComboBoxItem::changeItem(int index)
      {
          if(index >=0)
          {
              item->setData(this->column, Qt::UserRole, this->itemText(index));
              qDebug() item->data(this->column, Qt::UserRole).toString();
          }
      }
      
      #include "moc_ComboBoxItem.cpp"
      
      #endif // COMBOBOXITEM_H
      
      ////// Sample implementation..
      
      lst = new QTreeWidget;
      // Snip
      QTreeWidgetItem *itm = new QTreeWidgetItem;
      // Snip
      ComboBoxItem *cmb = new ComboBoxItem(itm, 1);
      cmb->addItem("One");
      cmb->addItem("Two");
      cmb->addItem("Three");
      cmb->addItem("Four");
      lst->setItemWidget(itm, 1, cmb);
      
      

      我希望对需要 QTreeWidgetItem 中的 QComboBox 的人有所帮助!

      【讨论】:

      • 谢谢,这种回答方式很感人,不知道谁选择了最佳答案!
      • 嗯,这个问题是在 2009 年发布的,我在 2011 年回答了它,所以我确定这就是原因。
      • :) 不过还是谢谢....真的很有帮助,因为我正在考虑使用代表来查看视图,但是这个解决方案要容易得多
      • 代替 item->setData(..) 试试这个: item->setText(column, itemText(index));它将触发 QTreeWidget 的改变值的信号。
      【解决方案3】:

      使用

      setItemWidget(QTreeWidgetItem(), column, QWidget())

      。只需将您的 QComboBox() 添加为参数,因为它继承了 QWidget() 所以它是兼容的。

      tree = QTreeWidget()
      
      cmb = QComboBox()
      cmb.addItem("Item1", 'value1')
      cmb.addItem("Item2", 'value2')
      cmb.addItem("Item3", 'value3')
      
      item = QTreeWidgetItem(tree.invisibleRootItem())
      column = 0
      item.setData(column, Qt.EditRole, 'NameYouWant')
      column += 1
      tree.setItemWidget(item, column , cmb)
      

      【讨论】:

      • 在这个例子中,Qt.EditRole 是什么?
      • Qt.EditRole 是一个全局预定义值 2,是枚举 Qt.ItemDataRole 的一部分
      【解决方案4】:

      这是对另一种海报方法的小修复。我发现这是使用数据来更新框我如何对方法的 setText 更新程序进行了小的更改。

      #ifndef COMBOBOXITEM_H
      #define COMBOBOXITEM_H
      
      #include <QtGui>
      
      class ComboBoxItem : public QComboBox
      {
          Q_OBJECT
      
      private:
          QTreeWidgetItem *item;
          int column;
      
      public:
          ComboBoxItem(QTreeWidgetItem*, int);
      
      public slots:
          void changeItem(int);
      
      };
      
      ComboBoxItem::ComboBoxItem(QTreeWidgetItem *item, int column)
      {
          this->item = item;
          this->column = column;
          connect(this, SIGNAL(currentIndexChanged(int)), SLOT(changeItem(int)));
      }
      
      void ComboBoxItem::changeItem(int index)
      {
          if(index >=0)
          {
              this->item->setText(this->column, this->currentText());
      
          }
      }
      
      #include "moc_ComboBoxItem.cpp"
      
      
      
      #endif // COMBOBOXITEM_H
      
      ////// Sample implementation..
      
      lst = new QTreeWidget;
      // Snip
      QTreeWidgetItem *itm = new QTreeWidgetItem;
      // Snip
      ComboBoxItem *cmb = new ComboBoxItem(itm, 1);
      cmb->addItem("One");
      cmb->addItem("Two");
      cmb->addItem("Three");
      cmb->addItem("Four");
      lst->setItemWidget(itm, 1, cmb);
      

      【讨论】:

        【解决方案5】:

        这是最简单的方法:

        QComboBox *cb = new QComboBox(this);
        QStringList cbTexts;
        cbTexts << tr("First") << tr("Second") << tr("Third");
        cb->addItems(cbTexts);
        
        QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
        ui->treeWidget->addTopLevelItem(item);
        ui->treeWidget->setItemWidget(item, [colum here], cb);
        for (int col = 0; col < [num colums]; ++col) ui->treeWidget->resizeColumnToContents(col);
        

        【讨论】:

          猜你喜欢
          • 2016-10-11
          • 2019-01-04
          • 1970-01-01
          • 1970-01-01
          • 2014-11-12
          • 2019-12-15
          • 2018-10-29
          • 2016-07-09
          • 1970-01-01
          相关资源
          最近更新 更多