【问题标题】:currentItemChanged signali is not gererated when clicking on check box of QTreeWidget单击 QTreeWidget 的复选框时不会生成 currentItemChanged 信号
【发布时间】:2012-10-16 05:02:20
【问题描述】:

单击非叶子项目的复选框时,QTreeWidget 未按预期工作。我的 QTreeWidget 有两个级别的子级,可以检查树小部件中的每个项目(每个项目都启用了复选框)。在这个 QTreeWidget 中,叶项是用户可选择的,但非叶项是不可选择的,并且所有项都已启用并且用户可以检查。

[]Family node1
  - []Primary node1
    - []child1
  - []Secondary node1
    - []child1
[]Family node2
  - []Primary node2
    - []child2
  - []Secondary node2
    - []child2

叶子项目标志设置

Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled

非叶子项目标志设置

Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate

当我们直接点击叶子项的关联复选框时,Qt 正在生成 currentItemChanged() 信号。但是,当我们直接单击非叶子项目的关联复选框时,不会生成 currentItemChanged() 信号。这给非叶子物品的处理带来不便。

它在 Qt 4.7.4 中运行良好,但在所有平台(Windows、Darwin 和 Linux)上的 Qt 4.8.1 中都无法运行。

我附上了一个示例程序来重现这个错误。

这是错误还是预期行为?

我在所有使用 Qt 4.8 的平台(Linux CentOS、Windows 7 和 MacOS)上都注意到了这个错误。

【问题讨论】:

  • 我为此问题创建了 Qt 错误报告 QTBUG-27567,您可以从 Qt 错误报告页面QTBUG-27567 下载示例程序。
  • +1 获取详细问题以及完整、可编译和可运行的示例!我刚刚在带有 Qt 4.8.2 的 MS Windows/MingW 上尝试过,我观察到以下内容:handleCurrentItemChanged() 仅在单击树节点的 TEXT 时调用。这与选择的变化是一致的:只有在被选择的节点之后才可视化选择。每当我单击复选框本身(叶子或非叶子)时,都不会调用 handleCurrentItemChanged()。对我来说,这看起来是正确的行为(可能也是 4.8.1 和 4.8.2 之间的差异)。问题是:你期望什么?
  • 我更新了我在 QTBUG-27567 中的评论,详细说明了为什么我们在 Qt 4.8 中获得与 Qt 4.7 不同的行为。此更改由 QTBUG-4435 引入。我希望当前项目应设置为单击项目。
  • 尽管有人质疑这是否是 Qt 中的回归:handleItemClicked() 中的 item->treeWidget()->clearSelection(); item->setSelected(true); 之类的东西有帮助吗?
  • 我们也不想在用户直接点击复选框时改变选择。所以,上面的效果不好。

标签: qt qtreewidget


【解决方案1】:

也许你正在寻找这样的东西:

//widget.h:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class QTreeWidgetItem;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void slotTest(QTreeWidgetItem *ite,int idx);
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

//widget.cpp:
#include "widget.h"
#include "ui_widget.h"

#include <QtGui>

Widget::~Widget()
{
    delete ui;
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->treeWidget->setColumnCount(1);
    QList<QTreeWidgetItem *> items;
    QTreeWidgetItem * item;
     for (int i = 0; i < 10; ++i)
     {
         item = new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i)));
         item->setCheckState(0,i%2 == 0 ? Qt::Unchecked : Qt::Checked);
         items.append(item);
     }
     connect(ui->treeWidget,SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(slotTest(QTreeWidgetItem*,int)));
     ui->treeWidget->insertTopLevelItems(0, items);
}


void Widget::slotTest(QTreeWidgetItem *ite,int idx)
{
    if(ite)
    {
        qDebug() << ite->text(0);
    }
}

//widget.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>274</width>
    <height>210</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QTreeWidget" name="treeWidget">
     <column>
      <property name="text">
       <string notr="true">1</string>
      </property>
     </column>
    </widget>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多