我正在使用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();
}
我不知道爲什麼信號發出兩次。使用調試器,設置斷點並找出調用的來源。 – Silicomancer 2014-10-18 07:51:04
發出來自Qt,我的代碼不會觸發任何信號,我不能把斷點放在Qt代碼中。 – Giacogiac 2014-10-20 07:49:36
是的,使用調用堆棧查看Qt源代碼,並嘗試找出這些發射完成的原因。 – Silicomancer 2014-10-20 07:56:07