QListWidget::itemSelectionChanged()用键盘激发了两次



我正在使用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中,并在再次打开对话框之前检查指针。

相关内容

  • 没有找到相关文章

最新更新