2014-10-17 236 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