1

大雑把なタイトルで申し訳ありません。

を含むクラスがありQListWidgetます。itemSelectionChanged()その信号をカスタムスロットに接続しました。

を呼び出すとQListWidget::clear()、(予想どおり) スロットが呼び出されQListWidget::count()ますが、このスロットで を呼び出すと、以前に持っていたアイテムの数が返されますQListWidget

への呼び出しのcount()直後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

0

まず第一にQListWidget::clear()、スロットであり、ではありません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 に答える