c++ - 了解其他类(class)发生的事件

标签 c++ qt events qwidget qevent

我有两个类:

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 对象中发生的事件的信息,我该怎么做?

最佳答案

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*/);

关于c++ - 了解其他类(class)发生的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41188135/

相关文章:

python - SQLAlchemy 事件接口(interface)

c++ - C++网络IO,文件处理和网络故障

c++ - 内存池背后的常见实现细节是什么?

c++ - Qt - Esc 不应该关闭对话框

linux - ARM 工具链在错误的库目录中查找

events - 如何添加事件处理程序仅在 sqlalchemy 中提交事务后触发一次

c++ - 将派生对象存储到 void*,然后从中转换基对象是否不安全?

c++ - 在 C++ 中迭代 vector

c++ - 未定义从dll引用非成员运算符

javascript - 两个 jQuery 事件处理程序 - 当两者都被触发时执行代码