将窗口中的小窗口按住拖动,使其在该窗口中移动。
效果图如下:

鼠标左键按住上图中的彩色窗口,就可以在窗口的客户区中来回拖动窗口。
项目的文件结构如下:

创建基于QWidget的应用程序,main.cpp的程序没有做任何的改变,主要的实现的代码如下:
dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void getDragAreaRect();//获取窗口可拖动的区域大小,客户端的区域void getMousePressRect();//获取鼠标按下的窗口的区域widget
protected:void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);
private:Ui::Dialog *ui;bool     m_isPress;//是否按下鼠标QPoint   m_startPos;//鼠标按下时的点QPoint   m_topleftPos;//被拖动窗口左上角的点QPoint   m_offsetPos;//窗口左上角于鼠标点击点的差值QRect    m_dragArea;//可进行拖动的区域QRect    m_pressArea;//被拖动的窗口的可点击区域
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QMouseEvent>
#include <QDebug>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog),m_isPress(false)
{ui->setupUi(this);getDragAreaRect();getMousePressRect();
}Dialog::~Dialog()
{delete ui;
}void Dialog::getDragAreaRect()
{m_dragArea = this->geometry();//客户区大小
}void Dialog::getMousePressRect()
{m_pressArea = ui->widget->rect();
}void Dialog::mousePressEvent(QMouseEvent *event)
{bool isContain = m_pressArea.contains(event->pos());
//    qDebug()<<"isContain:"<<isContain<<"m_pressArea:"<<m_pressArea;if(event->button() & Qt::MouseButton::LeftButton && isContain){//        qDebug()<<"鼠标按下";m_isPress = true;m_startPos = event->pos();m_topleftPos = ui->widget->frameGeometry().topLeft();m_offsetPos = m_startPos - m_topleftPos;}QWidget::mousePressEvent(event);
}void Dialog::mouseMoveEvent(QMouseEvent *event)
{if(m_isPress && m_dragArea.contains(event->pos()))//鼠标按下的点在整个可拖动区域内拖动{QPoint currPos = event->pos();int x = currPos.x() - m_offsetPos.x();int y = currPos.y() - m_offsetPos.y();int borderWid = m_dragArea.width() - m_pressArea.width();int borderHei = m_dragArea.height() - m_pressArea.height();if(x < 0){x = 0;}if(y < 0){y = 0;}if(x > borderWid){x = borderWid;}if(y > borderHei){y = borderHei;}ui->widget->move(x,y);}QWidget::mouseMoveEvent(event);
}void Dialog::mouseReleaseEvent(QMouseEvent *event)
{m_isPress = false;//更新被移动的窗口的位置,保证被点击的点在窗口内m_pressArea.setLeft(ui->widget->geometry().x());m_pressArea.setTop(ui->widget->geometry().y());m_pressArea.setRight(m_pressArea.left() + ui->widget->width());m_pressArea.setBottom(m_pressArea.top() + ui->widget->height());
//    qDebug()<<"m_pressArea:"<<m_pressArea;QWidget::mouseReleaseEvent(event);
}

ui文件只是向其中拖入了一个widget,并设置了其样式,其它没有做改变。

Qt在指定区域内拖动窗口相关推荐

  1. Qt 实现在窗口内拖动图片

    Qt在窗口内拖动图片: 把label中显示图片,把label放在QScrollArea中,当窗口内显示图片,当图片大小超过窗口时出现滚动条,当鼠标点击左键在窗口内移动时,窗口的滚动条和内容随鼠标移动而 ...

  2. qt中拖动窗口widget

    提要 继承与QDialog的窗口,窗口原本按住标题栏可以拖动窗口,但是设置了窗口的隐藏标题栏属性后,窗口不再能够拖动.或者继承于QWidget的窗体,不具有窗口拖动功能. 本文实现继承于窗口widge ...

  3. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)

    目录 1. 水平布局类(QHBoxLayout) 2.垂直布局类(QVBoxLayout) 3.网格布局类(QGridLayout) 3.1.单一的网络布局 3.2.跨越行.列的网络布局 4.表单布局 ...

  4. 【QT 5 设置自定义标题栏+学习:《QT实现鼠标拖动调整窗口大小》+基础样例】

    [QT 5 设置自定义标题栏+学习:<QT实现鼠标拖动调整窗口大小>+基础样例] 1.说明 2.实验环境 3.实验目的 4.参考文章 5.实验步骤 (1)下载代码,运行没有错误. (2)加 ...

  5. Qt Quick无边框窗口

    开发环境:Qt Creator 5.6 内容:  使用 Qt  Quick创建无边框窗口 Qt Quick是一个无比强大.无比方便快捷的跨平台的开发框架,并且能通过Qt强大的元对象系统实现qml与c+ ...

  6. Python Qt GUI设计:窗口布局管理方法【基础】(基础篇—5)

    目录 1.布局管理器进行布局 2.容器控件进行布局 3.geometry属性:控件绝对布局 4.sizePolicy属性:微调优化控件布局 Qt Designer提供4种窗口布局方式,分别如下: Ve ...

  7. qt如何把父窗口的变量传给子窗口_父窗口和iframe子窗口之间相互传递参数和调用函数或方法...

    1.父窗口向子窗口传递参数: 可以在url中添加参数:2.html?a=1&b=2&c=3 然后在子页面上可用js解析,提供一个函数: function getQueryStr(sAr ...

  8. Qt应用程序主窗口框架

    Qt 应用程序主窗口框架 1. Qt资源系统.菜单栏和工具栏 1.1 使用资源 1.2 编写代码方式添加菜单 1.3 菜单栏 1.4 工具栏 2. 中心部件 3. Dock部件 4. 状态栏 5. 例 ...

  9. Qt的对话框与窗口--标准的对话框

    Qt的对话框与窗口--标准的对话框 标准的对话框 QFileDialog对话框 1.选择打开一个文件 2.选择打开多个文件 3.选择已有目录 4.选择保存文件名 QColorDialog对话框 QFo ...

最新文章

  1. 自定义的GridView控件源代码
  2. Matlab GUI 基础(2):M文件
  3. Spark on YARN cluster client 模式作业运行全过程分析
  4. cocos2d-x游戏实例(4)-地图碰撞
  5. Linus下安装maven
  6. 41状态模式(State Pattern)
  7. 利用malloc定义数组
  8. DAEMON Tools
  9. 程序猿必备!最简单的颈椎操
  10. 恒大集团:网传《关于召开全国恒大财富投资人大会通知》系伪造
  11. debian安装中文字体
  12. mysql 5.7 多实例_window安装mysql5.7.25并创建mysql多实例
  13. Rhythmk 一步一步学 JAVA(9) JAVA 基础笔记[枚举,...]
  14. ab.exe压力测试
  15. “开宝五子棋读谱”软件的隐私政策和权限说明
  16. 索引算法原理解析(B-tree以及磁盘存储原理)
  17. vr 计算机配置,能玩VR的电脑装机 | 装机配置分享_什么值得买
  18. 我们眼中的人那是极少数,我们才是大多数人
  19. [HTML]列表、表格、表单
  20. Phpstorm好用插件

热门文章

  1. 如何画一张架构图(内含知识图谱)
  2. 3+1保障:高可用系统稳定性是如何炼成的?
  3. 五个问答,告诉你阿里云对象存储如何助力钉钉战胜业务洪峰
  4. UnixBench算分介绍
  5. 黑科技揭秘:阿里云如何做到从业务宕机到恢复业务运行只用一分半钟时间
  6. 机器学习的未来——深度特征融合
  7. 提升研发效率 保障数据安全——阿里云宣布数据管理DMS企业版正式商业化
  8. Gartner:企业机构需重新定义网络安全领导者角色
  9. 腾讯TAD Sim2.0领跑自动驾驶仿真市场 双擎驱动构建新一代仿真平台
  10. 如何系统学习领域驱动设计?