我正在使用QListWidget来选择列表中的文件,在选择时我会读取此文件,如果出现错误,我会清除所有选择并弹出一个错误。
只使用鼠标一切都很好,但当使用键盘箭头时,在一个坏文件上,信号会触发两次。
这很烦人,因为错误会弹出两次。
在这种情况下,有没有办法只弹出一次错误?
再现行为代码:
主窗口.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();
}
对话框问题有一个简单的解决方案。不使用QMessageBox::critical(),您可以在关闭时自动销毁的堆上创建一个对话框,将其地址存储在QPointer中,并在再次打开对话框之前检查指针。