我使用QListWidget选择列表中的文件,在选择时我读取此文件,如果出现错误,我会清除所有选择并弹出错误。
只使用鼠标一切正常,但使用键盘箭头时,在坏文件上,信号会触发两次。
这很烦人,因为错误会弹出两次。
在这种情况下,有没有办法只弹出一次错误?
重现行为的代码:
#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
#include <MainWindow.h>
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
答案 0 :(得分:0)
您的对话问题有一个简单的工作环境。您可以在堆上创建一个对话框,在关闭时自动销毁,将其地址存储在QPointer中并在再次打开对话框之前检查指针,而不是使用QMessageBox :: critical()。