Как установить фильтр событий на пользовательский класс Qt? - PullRequest
1 голос
/ 05 мая 2019

Я хочу установить фильтр событий на объект пользовательского класса в Qt. Поэтому я создал проект, такой как QtGuiApplication1, в Qt Designer и создал простой класс как myClass, в котором есть виджет и QGraphicsView для рисования цветного прямоугольника.

в заголовочном файле:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication1.h"
#include "myClass.h"

class QtGuiApplication1 : public QMainWindow
{
    Q_OBJECT
public:
    QtGuiApplication1(QWidget *parent = Q_NULLPTR);
private:
    Ui::QtGuiApplication1Class ui;
    bool eventFilter(QObject *obj, QEvent *ev);
    myClass* myClass_;
};

в .cpp

#include "QtGuiApplication1.h"


QtGuiApplication1::QtGuiApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    myClass_ = new myClass(this, QRect(100, 100, 200, 200));
    myClass_->installEventFilter(this);
}

bool QtGuiApplication1::eventFilter(QObject * obj, QEvent * ev)
{

    if (obj == myClass_)
    {
        bool hi = true;
    }

    return false;
}

и код myClass здесь:

заголовочный файл myClass:

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>
#include <QGraphicsView>

class myClass : public QObject
{
    Q_OBJECT
public:
    explicit myClass(QObject *parent = 0);
    myClass();
    myClass(QWidget* parent, QRect inRect);
private:
    QWidget * widget;
    QGraphicsView* qGraph_back;
    QGraphicsScene* scene_back;

};

#endif /

cpp файл myClass:

#include "myClass.h"

myClass::myClass(QObject *parent) :
    QObject(parent)
{
}

myClass::myClass()
{
}
myClass::myClass(QWidget* parent, QRect inRect)
{
    widget = new QWidget(parent);
    qGraph_back = new QGraphicsView(widget);
    scene_back = new QGraphicsScene(qGraph_back);

    widget->setGeometry(inRect);
    scene_back->setSceneRect(0,0,inRect.width(),inRect.height());
    qGraph_back->setBackgroundBrush(QColor(0, 0, 255, 80));
    qGraph_back->setScene(scene_back);
    qGraph_back->show();
}

Я хочу получить все события объекта myClass_, такие как событие мыши, но я не могу, и фильтр событий не работает. как установить eventfilter на объект?

1 Ответ

0 голосов
/ 05 мая 2019

Фильтр событий будет работать только для событий в вашем экземпляре MyClass, только. Не для своих детей.

Таким образом, такие события, как щелчок мыши или перемещение, в вашем qGraph_back не будут видимыми в вашем eventFilter методе.

Когда вы добавляете дочерний элемент в виджет, возникает событие QChildEvent. Вы можете использовать его для установки фильтра на всех дочерних элементов (и внуков и т. Д.). Но вы должны установить фильтр событий на MyClass перед добавлением дочерних элементов.

Быстрый пример:

class Listener: public QObject
{
public:
        Listener(): QObject()
        {}

        bool eventFilter(QObject* object, QEvent* event)
        {
            qDebug() << Q_FUNC_INFO << object << event;
            if (event->type() == QEvent::ChildAdded)
            {
                QChildEvent* ev = dynamic_cast<QChildEvent*>(event);
                ev->child()->installEventFilter(this);
            }
            return false;
        }
};

class Widget: public QWidget
{
    public:
Widget(QObject* parent) : QWidget()
{
    installEventFilter(parent);
    QGraphicsView* view = new QGraphicsView(this);
    auto layout = new QHBoxLayout(this);
    layout->addWidget(view);
    layout->addWidget(new QLabel("Foobar"))
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Listener* listener = new Listener();
    Widget* w = new Widget(listener);
    w->show();
    return app.exec();
}

Как видите, события в QLabel теперь отправляются слушателю. Но вы не можете видеть события из представления, потому что они перехвачены виджетом viewport в QGraphicsView ...

Вы должны обработать случай, когда у добавленного потомка есть область просмотра (наследуется от QAbstractItemView и т. Д.), И это становится более сложным.

Итак, если вам нужно знать, когда пользователь нажимает на ваше представление, было бы проще использовать сигналы / слоты, а не фильтр событий.

...