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

Qt 调用clear()时QListWidget的itemSelectionChanged()信号,qt,signals,qlistwidget,Qt,Signals,Qlistwidget,对不起,标题太大了 我有一个包含QListWidget的类。 我将它的itemSelectionChanged()信号连接到一个自定义插槽 当我调用QListWidget::clear()时,插槽会被调用(如预期的那样),但调用此插槽中的QListWidget::count()会返回QListWidget以前拥有的项目数 在调用clear()之后立即调用count()(当信号按所述处理时)返回正确的数字0 我准备好了。最重要的是此源文件: #include "ListWidgetTest.hpp

对不起,标题太大了

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

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

在调用
clear()
之后立即调用
count()
(当信号按所述处理时)返回正确的数字
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();
}
发生了什么

  • 列表将被填充
  • 每次单击项目都会调用
    selectionChanged()
  • 点击按钮调用
    clearList()
  • 调用
    QListWidget::clear()
    也会发出信号并调用插槽
  • 项目数尚未更改

  • 首先,
    QListWidget::clear()
    是一个插槽,而不是一个信号。因此,它显然没有发出/触发信号
    itemSelectionChanged()

    您可能在调用
    clear()
    之前意外触发了此
    itemSelectionChanged()
    。在调用
    clear()
    之前,检查您是否正在触发
    itemSelectionChanged()
    或触发
    itemSelectionChanged()
    的任何其他事件

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

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

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

    信号项SelectionChanged()是通过调用SLOT clear()发出的。由于“清除”将删除所有项目,因此选择将更改,从而发出信号。尽管如此,您的解决方案还是可行的,但并不能解释问题。我所做的只是单击一个按钮,我称之为“清除”。在插槽(对应于itemselectionchanged())中,我将代码放在lineedit中显示计数,但没有显示任何内容。那么我应该从中推断出什么呢?请把你的一些代码放在这里。创建了一个演示项目并将其链接起来。在我的系统中执行了它并输出了。。。。。void ListWidgetTest::clearList()clearList:ui->listWidget->count()为0。当我在clear()之后调用clearlist()中的Selectionchanged()时,输出为..void ListWidgetTest::clearlist()clearlist:ui->listWidget->count()为0 void ListWidgetTest::Selectionchanged()Selectionchanged:ui->listWidget->count()为0
     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
    
    connect(ui->pushButton, SIGNAL(clicked()),
                     this, SLOT(clearList()), Qt::QueuedConnection);
    
    connect(ui->listWidget, SIGNAL(itemSelectionChanged()),
                     this, SLOT(selectionChanged()), Qt::QueuedConnection);