【问题标题】:check if qtreewidgetitem checkbox is checked检查是否选中了 qtreewidgetitem 复选框
【发布时间】:2025-12-03 23:20:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    在这种情况下,有几件事可以解决问题:

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

    • 查看是否调用了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。因此,您应该会收到编译错误。

    【讨论】:

      【解决方案2】:

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

      【讨论】: