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);