我使用下面的代码创建了一个也是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)));
答案 0 :(得分:6)
您必须抓住来自QTreeWidget的信号itemChanged ( QTreeWidgetItem * item, int column )
。
答案 1 :(得分:4)
您的QTreeWidgetItem
与您的模型数据直接相关联,因此您应该连接到QTreeWidget模型的QAbstractItemModel::dataChanged
信号,以获得更改通知。
答案 2 :(得分:3)
连接到树的信号itemClicked(QTreeWidgetItem* item, int column)
。处理信号时,只需验证item->checkState(column)
。
答案 3 :(得分:3)
我们发现的最佳解决方案是在项子类中重新实现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都会启用此标志。
答案 4 :(得分:0)
将此信号添加到您的QTreeWidget对象:
connect(ui->treeWidget, &QTreeWidget::itemChanged, this, &YourDialog::treeWidgetItemChanged);
因此您可以使用此插槽接收信号:
void YourDialog::treeWidgetItemChanged(QTreeWidgetItem *TWI, int column)
{
//Do some staff
}