抱歉这个笨重的头衔。
我有一个包含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
会发生什么
selectionChanged()
clearList()
QListWidget::clear()
的调用也会发出信号并调用插槽答案 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);
这是有效的。但对不起,我不知道为什么。也许排队连接方法可以解决多信号顺序问题。