通过全局设置过滤器,就能让所有窗口都可移动,而不是都要继承指定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。而且在全局做任何事情都可以。

时间: 2024-11-08 04:16:34

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

窗口嵌入到另一个窗口(VC和QT都有)

1.用vc新建一个dialog1工程.属性默认. 2.insert一个dialog2,改为child. 3.在dialog1中包含dialog2头文件,在一个按钮事件中显示dialog2: Cdialog2 *p = new Cdialog2(this); p->Create(IDD_Dialog2); p->SetParent(this);//设置dialog1为父窗口 p->ShowWindow(SW_SHOW); 这样,dialog2便嵌到dialog1了,比用tabcontrol

WM_CLOSE、WM_DESTROY、WM_QUIT的区别(询问,销毁窗口,退出进程,都不是一回事)

1.发送消息SendMessage.PostMessage PostMessage将消息放入消息队列后马上返回,而SendMessage直到窗口过程处理完消息后才返回 2.三个消息的区别 WM_CLOSE: 在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE.DefWindowProc对 WM_CLOSE的处理是调用DestroyWindow.当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改等.如果用户选择“取消

自动填满窗口(宽度和高度都要填满)

要求 :A的高度是100px,宽度填满整个窗口,B,C的宽度分别是200px,100px,高度填满剩下的窗口,D的宽度和高度填满剩下的窗口. 我的想法:当时拿到这个题目的时候,宽度填满很简单,高度用自适应和百分之百都不行,就想到用js的方法,获取网页可用区域的宽度和高度  然后在相减就可以了,这个方法确实可以,不过昨晚回来查了下,其实用css方法也是可以的,之前自学的时候也学习过,不过没有用到实际的项目中 就忘记了,现在遇到这样的问题反而不会了.其实就是运用position:absolute的属

Qt自定义窗口,继承自QDialog,执行后返回rejected的问题分析

自定义了一个弹出窗口,添加了一个确定按钮,并定义了槽函数,处理结束后,调用 close(); 退出窗口,监测到返回值是Rejected十分不解,反复查看帮助文档,后来发现,使用Close()关闭窗口,本身就是拒绝窗口结果. 要调用 accept(); 来关闭窗口,返回值才会是Accepted.

js先弹出窗口,然后N秒后跳转指定网址

在家里的一段时间里,做了网页中的一个小功能,因为实在找不到原因了,只能先用JS来先解决一下了,问题是用银行卡已经充值成功了,但一定要返回重新刷新一下才能显示出来,也就是没有同步显示,当然了,如果用银行卡充值成功,然后停顿四五秒后再返回,则显示新的余额,所以这里涉及到一个异步的问题,暂用且 JS 来解决一下吧,先提示充值成功,然后停顿N秒后返回会员中心. <script> alert("充值成功"); function hello(){ window.location = &

Android 悬浮窗口

一.创建悬浮窗口步骤    1.实现一个ViewGroup类,作为悬浮窗口的界面类,以便在里面重写onInterceptTouchEvent和onTouchEvent方法,实现移动界面的目的.       在本例中实现了一个FloatLayer类,可以作为通用的类,使用时需要传入WindowManager对象以实现移动窗口. // FloatLayer ~ package com.example.hellofloatingwnd; import static com.ahai.util.Debu

Qt学习五 - 对话框

一.对话框简介 开发桌面程序,总会需要使用对话框来实现短期任务或者简洁的交互.在Qt中,提供了QDialog类来实现对话框.在QDialog和其子类中,对parent指针有额外的解释:当parent为NULL时,对话框会作为一个顶层窗口,否则则会作为其父组件的子对话框(此时默认显示在父组件的中心位置).可以新建一个项目,在主窗口上添加一个push button,然后在相应的槽函数中添加如下代码: QDialog dlg; dlg.setWindowTitle("hello dialog !&qu

MVC过滤器详解

APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常).如下表, 过滤器类型 接口 描述 Authorization IAuthorizationFilter 此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法 Exce

Duilib中的消息泵和虚拟窗口

Duilib中的消息泵和虚拟窗口 一.消息泵的结构 CNotifyPump类是构建Duilib消息泵的根父类,要使用消息泵机制的窗口类应该从该类继承.在继承关系的基础上,通过DUI_DECLARE_MESSAGE_MAP.DUI_BEGIN_MESSAGE_MAP.DUI_END_MESSAGE_MAP.DUI_ON_MSGTYPE.DUI_ON_MSGTYPE_CTRNAME.DUI_ON_CLICK_CTRNAME.DUI_ON_SELECTCHANGED_CTRNAME.DUI_ON_KI