1

对不起,笨重的标题。

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

当我调用QListWidget::clear()时,插槽被调用(如预期的那样),但QListWidget::count()在此插槽中的调用返回QListWidget之前拥有的项目数。

调用 tocount()之后的调用clear()(当信号按描述处理时)返回正确的 number 0

我准备了一个完整的演示项目。最重要的是这个源文件:

#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. 商品数量没有变化
4

2 回答 2

1

您可以将“Qt::QueuedConnection”添加到两个 QObject::connection。喜欢:

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

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

这是作品。但很抱歉,我不知道为什么。也许排队连接方法可以解决多信号顺序问题。

于 2018-05-05T00:35:06.633 回答
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
于 2012-05-21T09:53:37.680 回答