是否可以为QTreeWidgetItem复选框切换时创建一个信号?
我使用下面的代码创建了一个也是QTreeWidgetItem的复选框。是否可以为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的信号itemChanged (QTreeWidgetItem * item, int column)
。
这不好,因为它会随着树数据的变化而不断发出信号。 – 2014-04-02 05:32:03
连接到树的信号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都是打开的。
这是不正确的。 QTreeWidget没有用户模型。 – 2014-04-02 05:27:24
@GHuxley但是你仍然可以连接到一个QTreeWidget的底层默认模型,例如'treeWidget.model()。dataChanged.connect(handle_dataChanged)'。不知道这是否比连接到'itemChanged'更好,但它看起来很相似。 – blah238 2016-12-16 01:21:54