查看完整版本: [-- 不用继承所有窗体实现移动 --]

QTCN开发网 -> Qt代码秀 -> 不用继承所有窗体实现移动 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

sulwan 2019-11-19 00:37

不用继承所有窗体实现移动

代码不是我原创的,但是我修正了过去的警告,还有一个就是我注解了源码,主要是最近闲来无事,跟着 刘大师学习,争取早日成为一名合格的粉丝
   头文件
  1. #ifndef APPINIT_H
    #define APPINIT_H

    #include <QApplication>
    #include <QMouseEvent>
    #include <QMoveEvent>
    #include <QMutex>
    #include <QObject>
    #include <QPoint>
    #include <QWidget>

    class AppInit : public QObject {
      Q_OBJECT
    public:
      explicit AppInit(QObject *parent = nullptr);
      static AppInit *getInstance();
      void start();

    public:
      static AppInit *instance;

    public slots:
      bool eventFilter(QObject *obj, QEvent *event);

    private:
      static AppInit *self;
    };

    #endif  // APPINIT_H

   文件
  1. #include "appinit.h"
    #include <QDebug>

    // 初始化静态变量
    AppInit *AppInit::self = nullptr;

    // 构造函数
    AppInit::AppInit(QObject *parent) : QObject(parent) {}

    // 启动函数
    void AppInit::start() {
      // 监听过滤器安装到全局
      qApp->installEventFilter(this);
    }

    // 获取实例
    AppInit *AppInit::getInstance() {
      // 初始化类静态
      static QMutex mutex;
      if (!self) {
        QMutexLocker locker(&mutex);
        if (!self) {
          self = new AppInit;
        }
      }
      return self;
    }

    // 监听过滤器
    bool AppInit::eventFilter(QObject *obj, QEvent *event) {
      // 把基类转换为界面类
      QWidget *w = static_cast<QWidget *>(obj);
      // 读取属性是否为真,为真是可以移动
      if (!w->property("canMove").toBool()) {
        // 把事件传递回基类
        return QObject::eventFilter(obj, event);
      }
      // 鼠标是否按下
      static bool mousePressed;
      // 点位置
      static QPoint mousePoint;
      // 把事件强制转换为鼠标事件
      QMouseEvent *evt = static_cast<QMouseEvent *>(event);
      // 判断事件类型是不是鼠标左键
      if (evt->type() == QEvent::MouseButtonPress) {
        // 判断是否按下的左键
        if (evt->button() == Qt::LeftButton) {
          // 鼠标按下
          mousePressed = true;
          // 相对于桌面左上角原点坐标 - 距窗口左上上角去除边框的坐标
          mousePoint = evt->globalPos() - w->pos();
          return true;
        }
      } else if (event->type() == QEvent::MouseButtonRelease) {
        // 鼠标抬起
        mousePressed = false;
        return true;
      } else if (event->type() == QEvent::MouseMove) {
        // 鼠标移动事件
        // 鼠标左键按下,并没有抬起
        qDebug() << mousePressed;
        if (mousePressed && (evt->buttons() == Qt::LeftButton)) {
          // 移动窗体位置
          w->move(evt->globalPos() - mousePoint);
          return true;
        }
      }

      return QObject::eventFilter(obj, event);
    }
   使用
   1、在主函数main中调用
    
  1. AppInit::getInstance()->start();

   2、在需要移动的窗体构造函数中设置属性
  
  1. this->setProperty("canMove", true);

   代码到这里也就说完了,我继续烦着刘大师去,一个苦逼没事干的JAVA程序员



big_mouse 2020-03-25 10:19


查看完整版本: [-- 不用继承所有窗体实现移动 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled