Баг или ошибка? QGraphicsView и eventFilter.



  • Имеется QGraphicsView со сценой QGraphicsScene, на нем расположены два QGraphicsProxyWidget, в которые поставлены QPushButton. В первом случае я установил фильтр событий на QGraphicsProxyWidget, а во второй непосредственно на QPushButton. В фильтре событий, при обработке события нажатия, открываю модальное окно. Кнопка 1 зависает анимация, кнопка 2 отрабатывает хорошо. Почему так происходит и что с этим делать? Собрал тестовый пример данного бага, изначально заметил это на большом проекте, в нем имеется множество различных QGraphicsProxyWidget ( qpushbutton, qcombobox, qlabel, qtextedit etc. ) установленных на QGraphicsScene и фильтр событий установленный на QGraphicsProxyWidget.

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QPushButton>
    #include <QTimer>
    #include <QGraphicsView>
    #include <QGraphicsProxyWidget>
    #include <QGraphicsSceneMouseEvent>
    #include <QDebug>
    
    #include "ui_MainWindow.h"
    
    QT_BEGIN_NAMESPACE
    namespace Ui
    {
    class MainWindow;
    }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
        Ui::MainWindow *ui;
    
    public:
        MainWindow( QWidget *parent = nullptr )
            : QMainWindow( parent )
            , ui( new Ui::MainWindow )
        {
            ui->setupUi( this );
    
            auto view = new QGraphicsView();
            auto scene = new QGraphicsScene();
            view->setScene( scene );
    
            auto proxy1 = new QGraphicsProxyWidget();
            auto btn1 = new QPushButton( "btn 1" );
            btn1->setGeometry( 0, 0, 100, 100 );
            proxy1->setWidget( btn1 );
            scene->addItem( proxy1 );
    
            proxy1->installEventFilter( this );
    
    
            auto proxy2 = new QGraphicsProxyWidget();
            auto btn2 = new QPushButton( "btn 2" );
            btn2->setGeometry( 100, 100, 100, 100 );
            proxy2->setWidget( btn2 );
            scene->addItem( proxy2 );
            btn2->installEventFilter( this );
    
            setCentralWidget( view );
        }
    
        ~MainWindow()
        {
            delete ui;
        }
    
        bool eventFilter( QObject *watched, QEvent *event )
        {
            Q_UNUSED( watched );
    
            if ( event->type() == QEvent::GraphicsSceneMousePress ||
                 event->type() == QEvent::MouseButtonPress )
            {
                qDebug() << event->type();
    
                auto widget = new QWidget( this );
                widget->resize( 200, 200 );
                widget->setWindowFlag( Qt::Dialog );
                widget->setWindowModality( Qt::WindowModality::WindowModal );
    
                QTimer::singleShot( 0, this, [ = ]()
                {
                    widget->move( widget->pos() + QPoint( 300, 300 ) );
                } );
    
                widget->show();
            }
    
            return false;
        }
    };
    #endif // MAINWINDOW_H
    
    

Log in to reply