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

时间:2014-10-17 15:36:59

标签: c++ qt qt5 qlistwidget qt-signals

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

只使用鼠标一切正常,但使用键盘箭头时,在坏文件上,信号会触发两次。

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

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

重现行为的代码:

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();
}

1 个答案:

答案 0 :(得分:0)

您的对话问题有一个简单的工作环境。您可以在堆上创建一个对话框,在关闭时自动销毁,将其地址存储在QPointer中并在再次打开对话框之前检查指针,而不是使用QMessageBox :: critical()。