2014-10-17 29 views
0

我正在使用QListWidget在列表中選擇文件,選擇時我讀取此文件,以防錯誤我清除所有選擇並彈出錯誤。QListWidget :: itemSelectionChanged()使用鍵盤觸發兩次

一切工作正常只使用鼠標,但是當使用鍵盤箭頭,在一個壞的文件上,信號激發兩次。

這是令人討厭的,因爲錯誤彈出兩次。

在這種情況下,是否有任何方法只彈出一次錯誤?

代碼來重現問題:

MainWindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMessageBox> 
#include <QMainWindow> 
#include <QListWidget> 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 

    MainWindow(QWidget *parent = 0) 
     : QMainWindow(parent) 
    { 
     // Window title 
     setWindowTitle("My Widget"); 
     setMinimumSize(400,500); 

     // Creation of the QListWidgets 
     _listWidget = new QListWidget; 

     // Selection mode 
     _listWidget->setSelectionMode(QAbstractItemView::SingleSelection); 

     // Fill the table 
     for(int i = 1; i <= 10; i++) 
      _listWidget->addItem(QString::number(i)); 

     // Connect signals and slots 
     connect(_listWidget, SIGNAL(itemSelectionChanged()), 
       this, SLOT(onSelect())); 

     // Set central widget 
     setCentralWidget(_listWidget); 
    } 

    ~MainWindow() {} 

public slots: 

    void onSelect() 
    { 
     QList<QListWidgetItem*> itemsList = _listWidget->selectedItems(); 

     foreach (QListWidgetItem* item, itemsList) 
     { 
      // If the item is not valid, I want to unselect it 
      if(!isValid(item)) 
      { 
       // Block signal for fire error only one 
       _listWidget->blockSignals(true); 
       _listWidget->clearSelection(); 
       _listWidget->setCurrentItem(0); 
       _listWidget->blockSignals(false); 
       QMessageBox::critical(0, "Error", "Item Not Valid"); 
      } 
     } 
    } 

private: 

    bool isValid(QListWidgetItem* item) 
    { 
     int number = item->text().toInt(); 
     return (number%3 != 0); 
    } 

    QListWidget *_listWidget; 
}; 

#endif // MAINWINDOW_H 

的main.cpp

#include <MainWindow.h> 

#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 
+0

我不知道爲什麼信號發出兩次。使用調試器,設置斷點並找出調用的來源。 – Silicomancer 2014-10-18 07:51:04

+0

發出來自Qt,我的代碼不會觸發任何信號,我不能把斷點放在Qt代碼中。 – Giacogiac 2014-10-20 07:49:36

+0

是的,使用調用堆棧查看Qt源代碼,並嘗試找出這些發射完成的原因。 – Silicomancer 2014-10-20 07:56:07

回答

0

有一個簡單的workround爲你的對話框的問題。除了使用QMessageBox :: critical(),您可以在堆上創建一個關閉時自動銷燬的對話框,將其地址存儲在QPointer中,並在再次打開對話框之前檢查指針。

+0

如果我希望我的對話在所有的應用程序生命中都能運行一次,但是如果用戶不斷選擇錯誤的文件,它可能會多次出現,我只是不希望它出現兩次。 – Giacogiac 2014-10-20 07:46:37

+0

否。該workround可防止對話同時出現兩次。在應用程序生命週期中不是兩次。爲什麼你這麼想? – Silicomancer 2014-10-20 07:55:11

+0

第一個關閉後出現第二個對話框。它不會同時出現兩次,而是一次兩次。 – Giacogiac 2014-10-21 15:46:41