我使用下面的代码创建了一个也是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)));
有帮助吗?

解决方案

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

其他提示

必须抓住来自 qtreewidget

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

我们发现的最佳解决方案是在项目子类中重新实现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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top