1

我有一个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();
        }
}
4

2 回答 2

0

我犯了错误,因为在连接语句中我使用了 Qwidgetitem 而不是 qtreewidgetitem

于 2014-04-20T07:50:21.677 回答
0

我使用连接但我的插槽没有被调用,我在我的插槽中添加断点但我从未到达它

在这种情况下,可以做几件事来确定问题:

  • 检查控制台输出以查看是否有任何投诉。

  • 查看是否调用了连接语句。

  • 检查连接语句的返回值是否连接成功。

在这种特殊情况下,问题是匹配参数,因为您在 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其中添加。因此,您应该会收到编译错误。

于 2014-04-20T07:58:56.980 回答