1

我有两节课:

typedef std::shared_ptr<AdaptedWidget> window_ptr;

class WindowManager
{
public:
...
private:
    std::stack<window_ptr> m_windowsStack;
}

class AdaptedWidget: public QWidget
{
    Q_OBJECT
public:
    AdaptedWidget(AdaptedWidget *parent = 0);
    bool event(QEvent *event);
};

bool AdaptedWidget::event(QEvent *event)
{
    if (event->type() == QEvent::NonClientAreaMouseButtonPress ||
        event->type() == QEvent::MouseButtonPress)
    {
        qDebug() << "mainwindwo press";
    }
    return QWidget::event(event);
}

AdaptedWidget我需要从我的对象中获取有关对象中发生的事件的信息,WindowManager我该怎么做?

4

2 回答 2

1

事件过滤器是完成任务的 Qt 方式。

使您WindowManager的类成为其方法的子类QObject并为其提供实现。eventFilter()

之后,每次你创建一个AdaptedWidget使用installEventFilter()来安装你的WindowManager实例作为事件过滤器就可以了。

class WindowManager : public QObject
{
public:
...
bool eventFilter(QObject* obj, QEvent* ev);

private:
    std::stack<window_ptr> m_windowsStack;
}

bool WindowManager::eventFilter(QObject* obj, QEvent* ev){
    AdaptedWidget* widget= qobject_cast<AdaptedWidget*>(obj);
    if(ev->type == /*type of event you are interested in*/){
        //you can compare widget against the stack of widgets you have

        //if you want to stop widget from receiving the event you can return true
    }
    return false;
}

并在创建每个AdaptedWidget实例时,将其安装WindowManager为事件过滤器:

AdaptedWidget* widget= new AdaptedWidget;
widget->installEventFilter(/*your WindowManager instance*/);
于 2016-12-16T16:17:45.177 回答
1

该类AdaptedWidget应该有一个指示鼠标按下的信号,例如

class AdaptedWidget : ... {
  Q_OBJECT
  ...
public:
  Q_SIGNAL void mousePress(const QPoint &);
};

bool AdaptedWidget::event(QEvent *event)
{
    if (event->type() == QEvent::NonClientAreaMouseButtonPress ||
        event->type() == QEvent::MouseButtonPress)
    {
        auto ev = static_cast<QMouseEvent*>(event);
        emit mousePress(ev->pos());
        qDebug() << "mainwindow press";
    }
    return QWidget::event(event);
}

另一种方法是使用事件过滤器,但这会不必要地紧密耦合这两个类。

于 2016-12-16T19:16:32.017 回答