Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QListWidget::itemSelectionChanged()使用键盘触发两次_C++_Qt_Qt5_Qlistwidget_Qt Signals - Fatal编程技术网

C++ QListWidget::itemSelectionChanged()使用键盘触发两次

C++ QListWidget::itemSelectionChanged()使用键盘触发两次,c++,qt,qt5,qlistwidget,qt-signals,C++,Qt,Qt5,Qlistwidget,Qt Signals,我正在使用QListWidget选择列表中的文件,在选择时我读取此文件,如果出现错误,我将清除所有选择并弹出一个错误 只要使用鼠标,一切都可以正常工作,但当使用键盘箭头时,在一个坏文件上,信号会发出两次 这很烦人,因为错误会弹出两次 在这种情况下,有没有办法只弹出一次错误 复制行为的代码: 主窗口 main.cpp 对话问题有一个简单的解决方法。不使用QMessageBox::critical,您可以在堆上创建一个对话框,该对话框在关闭时自动销毁,将其地址存储在QPointer中,并在再次打开对

我正在使用QListWidget选择列表中的文件,在选择时我读取此文件,如果出现错误,我将清除所有选择并弹出一个错误

只要使用鼠标,一切都可以正常工作,但当使用键盘箭头时,在一个坏文件上,信号会发出两次

这很烦人,因为错误会弹出两次

在这种情况下,有没有办法只弹出一次错误

复制行为的代码:

主窗口 main.cpp
对话问题有一个简单的解决方法。不使用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();
}