2012-05-21 4 views
1

부피가 큰 제목은 불편을 드려 죄송합니다.clear()가 호출되었을 때 itemSelectionChanged() QListWidget의 신호

나는 QListWidget을 포함하는 클래스가 있습니다. itemSelectionChanged() 신호를 사용자 정의 슬롯에 연결했습니다.

QListWidget::clear()을 호출하면 예상대로 슬롯이 호출되지만이 슬롯에 QListWidget::count()을 호출하면 QListWidget의 항목 수가 반환됩니다.

clear() (신호가 설명 된대로 처리 된 경우) 호출 후 바로 count()을 호출하면 올바른 번호 0이 반환됩니다.

나는 a complete demo project을 준비했다.

  1. 목록이 채워 도착를 어떻게됩니까

    #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 
    

    : 가장 중요한 역할을 한이 소스 파일입니다. 항목에

  2. 모든 클릭 버튼에 클릭이 clearList()QListWidget::clear()에 대한 호출은 또한 신호을 방출
  3. 를 호출하고 슬롯이 아직 변경되지 않았습니다 항목 수
  4. 을 호출되는 selectionChanged()
  5. 를 호출

답변

0

우선 QListWidget::clear()은 슬롯 번호이고 SIGNAL이 아닙니다. 그래서 분명히 신호를 내보내거나 트리거하지 않습니다. itemSelectionChanged().

clear()으로 전화하기 직전에 실수로 itemSelectionChanged()을 유발했을 수 있습니다. 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 
+0

신호 itemSelectionChanged()는 SLOT clear()을 호출하여 생성됩니다. Clear는 모든 항목을 제거하기 때문에 선택이 변경되고 따라서 신호가 방출됩니다. 그럼에도 불구하고 귀하의 솔루션은 가능하지만 문제를 설명하지는 않습니다. – HWende

+0

내가 한 것은 분명히 버튼 클릭에 관한 것입니다. 그리고 SLOT (itemselectionchanged()에 해당)에서 lineedit.But에 아무 것도 표시되지 않은 횟수를 표시하는 코드를 넣었습니다. 그럼 내가 이걸 어떻게 추론해야합니까? 여기에 코드를 입력하십시오. – ScarCode

+0

데모 프로젝트를 만들고 링크했습니다. – HWende