12

我使用下面的代码创建了一个也是 QTreeWidgetItem 的复选框。

//Populate list
QTreeWidgetItem *program = createCheckedTreeItem(QString::fromStdString(itr->first), true);
treePrograms->addTopLevelItem(program);

QTreeWidgetItem* ConfigDialog::createCheckedTreeItem(QString name,bool checkBoxState)
{
  QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(name));
  item->setFlags(item->flags()|Qt::ItemIsUserCheckable);
  if (checkBoxState)
  {
    item->setCheckState(0,Qt::Unchecked);
  }
  else
  {
    item->setCheckState(0,Qt::Checked);
  }
  return item;
}

当此复选框的状态发生更改时,我需要一种连接信号和插槽的方法。我目前实现的方法如下,但不幸的是不起作用。有人可以解释我做错了什么以及我需要做什么才能使其连接吗?

connect(program, SIGNAL(toggled(bool)), this, SLOT(programChecked(bool)));
4

5 回答 5

8

你必须抓住itemChanged ( QTreeWidgetItem * item, int column )来自QTreeWidget的信号。

于 2012-03-13T15:34:01.013 回答
5

QTreeWidgetItem直接链接到您的模型数据,因此您应该连接到 QTreeWidget 的模型QAbstractItemModel::dataChanged信号以收到更改通知。

于 2012-03-13T15:13:22.577 回答
5

连接到itemClicked(QTreeWidgetItem* item, int column)树的信号。处理信号时,只需验证item->checkState(column).

于 2014-04-02T05:31:20.870 回答
3

我们找到的最佳解决方案是在 item 子类中重新实现 setData:

void MyItem::setData(int column, int role, const QVariant& value)
{
    const bool isCheckChange = column == 0
        && role == Qt::CheckStateRole
        && data(column, role).isValid() // Don't "change" during initialization
        && checkState(0) != value;
    QTreeWidgetItem::setData(column, role, value);
    if (isCheckChange) {
        MyTree *tree = static_cast<MyTree *>(treeWidget);
        emit tree->itemCheckStateChanged(this, checkState(0) == Qt::Checked);
    }
}

在 Qt 中确实有这个真的很方便,它让我考虑直接在那里贡献一个 itemCheckStateChanged 信号:)

PS:设置 Qt::ItemIsUserCheckable 是不必要的,默认情况下所有 QTreeWidgetItems 都打开此标志。

于 2015-09-04T17:47:50.197 回答
0

将此信号添加到您的 QTreeWidget 对象:

connect(ui->treeWidget, &QTreeWidget::itemChanged, this, &YourDialog::treeWidgetItemChanged);

所以你可以使用这个插槽来接收信号:

void YourDialog::treeWidgetItemChanged(QTreeWidgetItem *TWI, int column)
{
    //Do some staff
}
于 2020-12-01T14:14:45.730 回答