通过全局设置过滤器,就能让所有窗口都可移动,而不是都要继承指定QDialog

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过全局设置过滤器,就能让所有窗口都可移动,而不是都要继承指定QDialog相关的知识,希望对你有一定的参考价值。

#include "appinit.h"
#include <QMouseEvent>
#include <QApplication>
#include <QWidget>
AppInit::AppInit(QObject *parent) : QObject(parent)
{
    mousePressed = false;
    qApp->installEventFilter(this);
}

void AppInit::load()
{

}

bool AppInit::eventFilter(QObject *obj, QEvent *evt)
{
    QWidget *w = (QWidget *)obj;
    if(evt->type () == QEvent::KeyPress)
        {
            QKeyEvent * event = static_cast<QKeyEvent *>(evt);
            if(event->key () == Qt::Key_Escape)
            {
                return true;
            }
        }

    if (!w->property("CanMove").toBool()) {
        return QObject::eventFilter(obj, evt);
    }

    QMouseEvent *event = static_cast<QMouseEvent *>(evt);
    if (event->type() == QEvent::MouseButtonPress) {
        if (event->button() == Qt::LeftButton) {
            mousePressed = true;
            mousePoint = event->globalPos() - w->pos();
            return true;
        }
    } else if (event->type() == QEvent::MouseButtonRelease) {
        mousePressed = false;
        return true;
    } else if (event->type() == QEvent::MouseMove) {
        if (mousePressed && (event->buttons() && Qt::LeftButton)) {
            w->move(event->globalPos() - mousePoint);
            return true;
        }
    }
    return QObject::eventFilter(obj, evt);
}

这个方法的最大特点是,不影响其它类层次的设计,而不必强行指定继承我的QDialog。而且在全局做任何事情都可以。

 

以上是关于通过全局设置过滤器,就能让所有窗口都可移动,而不是都要继承指定QDialog的主要内容,如果未能解决你的问题,请参考以下文章

Android中的EditText中,输入信息时,怎么能让光标停靠在输入的信息的右侧而不是左侧呢?

Windows的上帝模式

Unity 编辑器学习之 全局光照(GI)

使用 ORM 原则过滤数据库上的所有查询

编程猫scratch少儿编程在线课程-在家就能让孩子学习编程的视频教程

Vue——的全局过滤器的创建