如何在QTableWidget中添加复选框/单选按钮

33

我该如何在 QTableWidget 或 QListWidget 中添加复选框 / 单选按钮 / 下拉框?

3个回答

64

有两种方法:

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

以及

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

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


6
我同意这个没有被选为正确答案让人感到困惑。我没有花很多时间进行调查,但我原以为在 QTableWidgetItem 上设置 checkable 标志会使复选框出现,但实际上并没有。不过,setCellWidget() 可以解决这个问题。 - Scott
1
你应该检查 checkbox.checkState() == 0 or == 2,一个未选中,另一个选中。我以Python为例进行了示范,你应该将“.”转换为“->”。 - PersianGulf
5
请尽量避免使用字面数字,而应使用适当命名的常量,例如Qt::CheckState。这样可以使您的代码更易读和更易于维护(常量的实际值可以更改,而无需修改整个代码库以反映更改)。 - Luc Touraille

22

对于使用条目的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

Spin Box Delegate

我希望这可以帮助你。

11
惊讶这条评论被选为正确答案。因为将QListWidgetItem设置为勾选状态并不完全等同于“将复选框添加到表格或列表”。此外,创建委托并不是在表格或列表中插入这些小部件的方法,它仅用于编辑单元格。 - Pie_Jesu
可能是因为这是 OP 想要的。由于他的问题是开放性的,所以这个答案是他可以创建/设置小部件的方式之一。此外,在大多数情况下,当您编辑字段而不是查看它时,希望显示控件。通过 setCellWidget 向单元格提供小部件并不会使该小部件成为模型的一部分,您仍然需要手动处理小部件的内容和事件。 - serge_gubenko
你能详细说明一下你关于“QListWidget和QTableWidget。它们不可能重新实现委托”的评论吗?这两个小部件都是QAbstractItemView的子类,没有任何阻止你为它们设置项目委托。我的帖子中的SpinBox示例与QTableWidget完美地配合使用。 - serge_gubenko
它在哪里明确地说“无法为它们重新实现委托”? - serge_gubenko
2
这个答案是完全错误的。正确答案如下。 - Michael Leonard
1
进一步证据表明,StackOverflow 应该默认将当前获得最多赞同票的答案标记为“已采纳”。 - Cecil Curry

3
您也可以像这样添加复选框。
#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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接