C++ QListWidget::itemSelectionChanged()使用键盘触发两次
我正在使用QListWidget选择列表中的文件,在选择时我读取此文件,如果出现错误,我将清除所有选择并弹出一个错误 只要使用鼠标,一切都可以正常工作,但当使用键盘箭头时,在一个坏文件上,信号会发出两次 这很烦人,因为错误会弹出两次 在这种情况下,有没有办法只弹出一次错误 复制行为的代码: 主窗口 main.cppC++ QListWidget::itemSelectionChanged()使用键盘触发两次,c++,qt,qt5,qlistwidget,qt-signals,C++,Qt,Qt5,Qlistwidget,Qt Signals,我正在使用QListWidget选择列表中的文件,在选择时我读取此文件,如果出现错误,我将清除所有选择并弹出一个错误 只要使用鼠标,一切都可以正常工作,但当使用键盘箭头时,在一个坏文件上,信号会发出两次 这很烦人,因为错误会弹出两次 在这种情况下,有没有办法只弹出一次错误 复制行为的代码: 主窗口 main.cpp 对话问题有一个简单的解决方法。不使用QMessageBox::critical,您可以在堆上创建一个对话框,该对话框在关闭时自动销毁,将其地址存储在QPointer中,并在再次打开对
对话问题有一个简单的解决方法。不使用QMessageBox::critical,您可以在堆上创建一个对话框,该对话框在关闭时自动销毁,将其地址存储在QPointer中,并在再次打开对话框之前检查指针。我不知道为什么会发出两次信号。使用调试器,设置断点并找出调用来自何处。发射来自Qt,我的代码不触发任何信号,我不能在Qt代码中设置断点。是的,使用调用堆栈查看Qt源并尝试找出这些发射的原因。我不知道如何做,触发信号的Qt代码已经编译好了,调用堆栈只是带我看一些反汇编的代码。如果我希望我的对话框在整个应用程序生命周期中只出现一次,但是如果用户一直选择坏文件,它可能会出现多次,我只是不希望它在单个操作中出现两次。不。该工作区防止对话框同时出现两次。在应用程序生命周期中,不会出现两次。为什么会这样?第一个对话框关闭后会出现第二个对话框。它不会同时出现两次,而是连续出现两次。
#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();
}