调用clear()时,QListWidget的itemSelectionChanged()信号

时间:2012-05-21 09:25:36

标签: qt signals qlistwidget

抱歉这个笨重的头衔。

我有一个包含QListWidget的课程。 我将itemSelectionChanged()信号连接到自定义插槽。

当我拨打QListWidget::clear()时,会调用插槽(按预期方式),但此插槽中对QListWidget::count()的调用会返回QListWidget之前的项目数。

在调用count()之后立即拨打clear()(如上所述处理信号时)会返回正确的号码0

我准备了a complete demo project。最重要的是这个源文件:

#include "ListWidgetTest.hpp"
#include "ui_ListWidgetTest.h"
#include <QDebug>

ListWidgetTest::ListWidgetTest(QWidget* parent)
    : QWidget(parent), ui(new Ui::ListWidgetTest)
{
    ui->setupUi(this);

    for (int i = 0; i < 5; ++i) {
        QListWidgetItem* item = new QListWidgetItem(QString("Item %1").arg(i));
        ui->listWidget->addItem(item);
    }

    QObject::connect(ui->pushButton, SIGNAL(clicked()),
                     this, SLOT(clearList()));

    QObject::connect(ui->listWidget, SIGNAL(itemSelectionChanged()),
                     this, SLOT(selectionChanged()));
}

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

void ListWidgetTest::clearList()
{
    qDebug() << "void ListWidgetTest::clearList()";
    ui->listWidget->clear();
    qDebug() << "clearList: ui->listWidget->count() is " << ui->listWidget->count();
}

void ListWidgetTest::selectionChanged()
{
    qDebug() << "void ListWidgetTest::selectionChanged()";
    qDebug() << "selectionChanged: ui->listWidget->count() is " << ui->listWidget->count();
}

输出

void ListWidgetTest::clearList() 
void ListWidgetTest::selectionChanged() 
selectionChanged: ui->listWidget->count() is  5
clearList: ui->listWidget->count() is  0

会发生什么

  1. 列表已填充。
  2. 对项目的每次点击都会调用selectionChanged()
  3. 点击按钮会调用clearList()
  4. QListWidget::clear() 的调用也会发出信号并调用插槽
  5. 项目数尚未更改

2 个答案:

答案 0 :(得分:0)

首先QListWidget::clear()是SLOT,而不是SIGNAL。很明显它不会发出/触发信号itemSelectionChanged()

在致电itemSelectionChanged()之前,您可能会意外触发此clear()。在致电itemchanged()之前,请检查您是在触发selectionchanged()itemSelectionChanged()还是触发clear()的任何其他事件。

 One possible solution is to declare a custom signal and emit this signal just 
 after calling clear(). And connect it to the custom slot you have defined.You
 will get the expected value in your SLOT

答案 1 :(得分:0)

您可以添加&#34; Qt :: QueuedConnection&#34;两个QObject ::连接。像:

connect(ui->pushButton, SIGNAL(clicked()),
                 this, SLOT(clearList()), Qt::QueuedConnection);

connect(ui->listWidget, SIGNAL(itemSelectionChanged()),
                 this, SLOT(selectionChanged()), Qt::QueuedConnection);

这是有效的。但对不起,我不知道为什么。也许排队连接方法可以解决多信号顺序问题。