检查是否选中了qtreewidgetitem复选框

时间:2014-04-20 07:44:57

标签: c++ qt qtgui qt-signals qtreewidgetitem

我有一个带有可检查项目的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();
        }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

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

在这种情况下,可以采取一些措施来解决问题:

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

  • 查看是否调用了connect语句。

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

在这种特殊情况下,问题是匹配参数,因为你有这个用于连接语句:

SLOT(playerChecked(QWidgetItem*,int))

而你有这个插槽声明:

playerChecked(QTreeWidgetItem *item, int i)

您可以看到QWidgetItemQTreeWidgetItem的混合。这也可能适用于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。你应该得到一个编译错误。