提要

继承与QDialog的窗口,窗口原本按住标题栏可以拖动窗口,但是设置了窗口的隐藏标题栏属性后,窗口不再能够拖动。或者继承于QWidget的窗体,不具有窗口拖动功能。
本文实现继承于窗口widget或者继承于QDialog隐藏窗口标题栏的窗口鼠标按下后不放可以拖动,鼠标释放后停止拖动。要想实现这样的功能继承于QWidget的窗体需要重写鼠标按下,移动,释放事件。继承于QDialog窗口但是隐藏窗体标题栏的也是一样的,需重写上面的三个方法。

示例

namedialog.h

#ifndef NAMEDIALOG_H
#define NAMEDIALOG_H#include <QDialog>/******类功能描述:设置大屏列表的名称*****/
namespace Ui {class NameDialog;
}class NameDialog : public QDialog
{Q_OBJECTpublic:explicit NameDialog(QWidget *parent = nullptr);~NameDialog();
protected:void mousePressEvent(QMouseEvent *event);//鼠标点击void mouseMoveEvent(QMouseEvent *event);//鼠标移动事件void mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件
private:Ui::NameDialog *ui;QPoint          m_offPos;//鼠标点击点与窗口左上角的距离
};#endif // NAMEDIALOG_H

namedialog.cpp

#include "namedialog.h"
#include "ui_namedialog.h"
#include <QMouseEvent>NameDialog::NameDialog(QWidget *parent) :QDialog(parent),ui(new Ui::NameDialog)
{ui->setupUi(this);setWindowFlag(Qt::FramelessWindowHint);
}NameDialog::~NameDialog()
{delete ui;
}void NameDialog::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {QPoint startPos = event->globalPos();m_offPos = startPos - geometry().topLeft();}QDialog::mousePressEvent(event);
}void NameDialog::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() == Qt::LeftButton) {QPoint endPos = event->globalPos();move(endPos - m_offPos);}QDialog::mouseMoveEvent(event);
}void NameDialog::mouseReleaseEvent(QMouseEvent *event)
{QDialog::mouseReleaseEvent(event);
}

以上重写鼠标按下,移动和释放事件便可以实现窗体的按下拖动。如果是继承于QWidget窗体,则基类为QWidget,相应的在继承于QWidget的类中实现鼠标的点击,移动和释放事件,函数的实现几乎一样,唯一不一样的是,调用父类的点击,移动和释放事件,将QDialog::mousePressEvent(event);改为QWidget::mousePressEvent(event);依次类推,如下。

#ifndef NAMEDIALOG_H
#define NAMEDIALOG_H#include <QDialog>/******类功能描述:设置大屏列表的名称*****/
namespace Ui {class NameWidget;
}class NameWidget: public QWidget
{Q_OBJECTpublic:explicit NameWidget(QWidget *parent = nullptr);~NameWidget();
protected:void mousePressEvent(QMouseEvent *event);//鼠标点击void mouseMoveEvent(QMouseEvent *event);//鼠标移动事件void mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件
private:Ui::NameWidget*ui;QPoint          m_offPos;//鼠标点击点与窗口左上角的距离
};#endif // NAMEDIALOG_H
#include "namewidget.h"
#include "ui_namewidget.h"
#include <QMouseEvent>NameWidget::NameWidget(QWidget *parent) :QWidget(parent),ui(new Ui::NameWidget)
{ui->setupUi(this);setWindowFlag(Qt::FramelessWindowHint);
}NameWidget::~NameWidget()
{delete ui;
}
void NameWidget::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {QPoint startPos = event->globalPos();m_offPos = startPos - geometry().topLeft();}QWidget::mousePressEvent(event);
}void NameWidget::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() == Qt::LeftButton) {QPoint endPos = event->globalPos();move(endPos - m_offPos);}QWidget::mouseMoveEvent(event);
}void NameWidget::mouseReleaseEvent(QMouseEvent *event)
{QWidget::mouseReleaseEvent(event);
}

qt中拖动窗口widget相关推荐

  1. QT中关于窗口全屏显示与退出全屏的实现

    近期在学习QT时遇到了很多问题这也是其中一个,个人通过在各种书籍和网络上的查阅找到了一些关于这方面的答案,希望能给大家一些帮助. 首先,在QT中对于窗口显示常用的有这么几个方法可以调用: Qt全屏显示 ...

  2. QT中父子窗口事件传递与事件过滤器

    处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...

  3. qt中设置窗口左上角的图标

    前面一节已经详细的讲解了怎么添加图片到qt的图片资源文件中,这里就不赘述了,不太了解的可以看看博主的这篇随笔:qt中建立图片资源管理文件 this->setWindowIcon(QIcon(&q ...

  4. qt中opengl窗口的创建

    该笔记借鉴自 : "懂deeee珍惜"的 现代OpenGL+Qt学习笔记之二:程序框架 "爱种鱼的猫"的 QT中使用OpenGL(0)--创建一个窗口 引用引自 ...

  5. Qt中设置窗口边框的圆形

    Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口. 下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this ...

  6. 关于QT中对窗口中某个widget建类

    两种方法建类,当然如果算上纯手工的方法当我没说. 第一种 file->Qt->Qt Designer Form class 然后选择 Widget 注意这样创建的widget会有自己的ui ...

  7. qt中关闭窗口资源释放问题

    针对QDialog对象,如果是栈上分配的,就不存在资源泄漏问题,但是当对象是new出来的,并且以局部对像存在,当关闭时,窗口只是隐藏,资源是没有释放的,每次exec后者需要delete来释放,另外一种 ...

  8. Qt中实现窗口右键菜单

    1.在Qt设计师中选中mainwindow,将contextMenuPolicy属性修改为CustomContextMenu. 2.在菜单中选编辑信号与槽,点击主窗口空白处.会弹出如下 3.选择cus ...

  9. qt中使窗口的大小随窗口的内容大小进行调整

    提要 窗口用于显示文本信息,当窗口的文本信息变长,原有窗口的大小不足以显示文本信息.这时就需要一个能够根据窗口要显示的文本信息的长度来调整窗口大小的窗口. 示例 效果图: 窗口内容少的时候提示窗口大小 ...

最新文章

  1. MySQL计算指标连续两月金额相比_20160929
  2. 35岁改行做程序员,需要勇气和决心
  3. PostgreSQL(从版本9.3至11.2)任意命令执行漏洞 cve-2019-9193
  4. com接口传入、传出字符串的说明和例程
  5. 桌面电话的进化到统一通信
  6. mysql子查询_笔记之MySQL子查询
  7. php里面的MySql
  8. 高考填报志愿计算机操作技巧,填报高考志愿技巧和方法有哪些
  9. mysql 拒绝访问的解决办法
  10. ccd相机好修吗_CCD到底值不值得买,CCD相机入坑全过程
  11. java 类文件_Java类文件概述
  12. R 语言之数据分析高级方法「GLM 广义线性模型」
  13. 复变函数:傅里叶变换
  14. qq和qq浏览器的区别
  15. 用计算机求平方根立方根,利用计算器求平方根、立方根
  16. 忆典s1Android,忆典S1四核(RK3128)官方固件+安卓4.4.4已Root权限精简固件+刷机教程
  17. java中计算文件的md5,Java计算文件MD5值代码
  18. 关于cad生成dwf文件和插入dwf快
  19. 微信小程序红包 php,微信小程序实现红包功能(后端PHP实现逻辑)
  20. 抽奖活动啦!5本SpringMVC+MyBatis相关、3本Android Studio相关、6本Kafka相关

热门文章

  1. Dubbo-go 优雅上下线设计与实践
  2. 一文了解EPaxos核心协议流程
  3. 阿里云AHAS Chaos:应用及业务高可用提升工具平台之故障演练
  4. 开源应用诊断利器 Arthas GitHub Star 突破两万
  5. 【干货索引】阿里云大数据计算服务MaxCompute与生态系统的融合
  6. 探索交通治理新思路,广州黄埔智能交通治“堵”
  7. 今天,Python信息量很大!
  8. 华为:跨过时艰,向未来
  9. Cloud一分钟 | 谷歌退出美国防部云计算竞标;网络黑灰产业已近千亿,个人信息泄露是源头...
  10. java jndi使用_Java项目中使用JNDI连接数据库