【问题标题】:How can I add a checkbox/radio button to QTableWidget如何向 QTableWidget 添加复选框/单选按钮
【发布时间】:2011-07-19 03:57:18
【问题描述】:

如何将复选框/单选按钮/组合框添加到 QTableWidget 或 QListWidget?

【问题讨论】:

    标签: c++ qt qt4 qt-creator qtablewidget


    【解决方案1】:

    有两种方法:

    void QTableWidget::setCellWidget(int row, int column, QWidget* widget)
    

    void QListWidget::setItemWidget(QListWidgetItem* item, QWidget* widget)
    

    它们允许插入任何小部件和其他继承 QWidget 的控件。复选框/单选按钮/组合框继承自QWidget

    【讨论】:

    • 我同意这令人困惑,这没有被选为正确答案。我没有花很多时间进行调查,但我认为在 QTableWidgetItem 上设置可检查标志会使复选框出现 - 它没有。不过 setCellWidget() 有效。
    • 你应该检查checkbox.checkState() == 0 or == 2 一个 unckecked 和另一个 ckecked ,我用 python 举例,你应该转换。到 ->
    • @MohsenPahlevanzadeh:当您可以使用恰当命名的常量时,请避免使用文字数字:Qt::CheckState。这将使您的代码更具可读性和更易于维护(常量的实际值可以更改,而无需修改整个代码库以反映更改)。
    【解决方案2】:

    你也可以像这样添加复选框

    #include <QCheckBox>
    
    void addCheckBoxAt(int row_number, int column_number,int state)
    {
    
        // Create a widget that will contain a checkbox
         QWidget *checkBoxWidget = new QWidget();
         QCheckBox *checkBox = new QCheckBox();      // We declare and initialize the checkbox
         QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget); // create a layer with reference to the widget
         layoutCheckBox->addWidget(checkBox);            // Set the checkbox in the layer
         layoutCheckBox->setAlignment(Qt::AlignCenter);  // Center the checkbox
         layoutCheckBox->setContentsMargins(0,0,0,0);    // Set the zero padding
         /* Check on the status of odd if an odd device,
           * exhibiting state of the checkbox in the Checked, Unchecked otherwise
           * */
    
          if(state == 1){
              checkBox->setChecked(true);
          } else {
              checkBox->setChecked(false);
          }
          ui->job_table_view->setCellWidget(row_number,column_number, checkBoxWidget);
    
    
         // Another way to add check box as item
        /*
    
       // QTableWidgetItem *checkBoxItem = new QTableWidgetItem("checkbox string ");
        QTableWidgetItem *checkBoxItem = new QTableWidgetItem();
        checkBoxItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
        checkBoxItem->setCheckState(Qt::Checked);
        ui->job_table_view->setItem(row_number,column_number,checkBoxItem);
    
        */
    }
    

    // 像这样称呼它

    addCheckBoxAt(0,0,1);  // insert checkbox it 0,0 and check status true
    

    【讨论】:

      【解决方案3】:

      对于使用项目的setCheckState 方法的复选框应该可以满足列表和表格小部件的需要。看看下面的代码是否适合你:

      列表小部件:

      QListWidgetItem *item0 = new QListWidgetItem(tr("First"), listWidget);
      QListWidgetItem *item1 = new QListWidgetItem(tr("Second"), listWidget);
      
      item0->setCheckState(Qt::Unchecked);
      item1->setCheckState(Qt::Checked);
      

      表格小部件:

      QTableWidgetItem *item2 = new QTableWidgetItem("Item2");
      item2->setCheckState(Qt::Checked);
      tableWidget->setItem(0, 0, item2);
      

      您可以将委托 (QItemDelegate) 用于其他类型的编辑器小部件,示例如下:Spin Box Delegate Example

      我希望这会有所帮助。

      【讨论】:

      • 哇。很惊讶这条评论被选为正确答案。因为将 QListWidgetItem 设置为检查状态并不完全是adding checkbox to Table or to List。此外,创建委托并不是在 Table 或 List 中插入这些小部件的方法。它仅用于编辑单元格。
      • 可能是因为这是 OP 想要的。而且由于他的问题是开放式的,所以这个答案是他如何创建\设置他的小部件的方法之一。此外,在大多数情况下,您希望在编辑字段而不查看它时显示控件。通过 setCellWidget 向单元格提供一个小部件不会使这个小部件成为模型的一部分,您仍然需要手动处理小部件的内容和事件。
      • 您能否详细说明您的“QListWidget 和 QTableWidget。不可能为它们重新添加代表”评论?这两个小部件都是 QAbstractItemView 的后代,没有什么可以阻止您为它们设置项目委托。我帖子中的 spinbox 示例与 QTableWidget 完美配合
      • 这个答案完全不正确。正确答案如下。
      • 进一步的证据表明 StackOverflow 应该默认动态地将当前获得最多支持的答案标记为“已接受”。
      猜你喜欢
      • 2018-12-06
      • 2018-03-23
      • 1970-01-01
      • 2018-09-13
      • 2014-02-25
      • 2018-04-19
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多