我有一个带有可检查项目的qtreewidget
,我可以检查和取消选中元素,我想检查项目是否被选中,我使用connect
但是我的slot
没有被调用,我在我的插槽中添加了断点,但我从未到达它,我这样连接:
connect(_events, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(eventChecked(QWidgetItem*,int)));
connect(_player, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(playerChecked(QWidgetItem*,int)));
我同时使用了 itemClicked 和 itemChanged 但我的插槽从未调用过,我的插槽是:
playerChecked(QTreeWidgetItem *item, int i)
{
if(item->checkState(i) == Qt::Checked) {
std::cout << "reached here" << std::endl;
} else {
operators->printAllowedPlayers();
}
}
i use connect but my slot is not called, i add break point in my slot but i never reach it
在这种情况下,可以做几件事来确定问题:
检查控制台输出以查看是否有任何投诉。
查看connect语句是否被调用。
检查连接语句的返回值是否连接成功。
在这种特殊情况下,问题是匹配参数,因为连接语句有这个:
SLOT(playerChecked(QWidgetItem*,int))
鉴于您有此插槽声明:
playerChecked(QTreeWidgetItem *item, int i)
您可以看到 QWidgetItem
和 QTreeWidgetItem
的混合。这可能也适用于 eventChecked
插槽。您需要使它们匹配,可能是通过将 QTreeWidgetItem* 传递给插槽,特别是因为信号还包含插槽所连接的内容。这将分别是解决方案:
connect(_events, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(eventChecked(QTreeWidgetItem*,int)));
connect(_player, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(playerChecked(QTreeWidgetItem*,int)));
就我个人而言,我什至会删除 this
参数,因为它是隐式的。这使得行更短,但不会降低其全面性。
此外,您的插槽定义似乎不包含返回值。您需要在其中添加 void
。因此你应该得到一个编译错误。
我是一名优秀的程序员,十分优秀!