【问题标题】:Learn about occurred events from other class了解其他班级发生的事件
【发布时间】:2017-05-02 11:18:16
【问题描述】:

我有两个班级:

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

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

【问题讨论】:

  • 一个可以监听事件(订阅)或另一个可以告诉事件发生(发布)。
  • @hg_git 请给我一些例子

标签: c++ qt events qwidget qevent


【解决方案1】:

Event filters 是完成任务的 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*/);

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多