Qt软件开发文档19---无边框窗体的自定义移动
来源:互联网 发布:gkz cloud sql 编辑:程序博客网 时间:2024/05/22 00:41
绘制一个Qt界面时候,往往需要使用无边框窗体,同时需要自定义窗体的移动,拖拽等事件。
setWindowFlags(Qt::FramelessWindowHint);
利用 mouseEvent写入
void MainWindow::mousePressEvent(QMouseEvent * event){ if (event->button() == Qt::LeftButton) { m_mousepressed = true; m_point = event->globalPos() - this->pos(); event->accept(); }}void MainWindow::mouseMoveEvent(QMouseEvent * event){ if( (m_mousepressed == true) && (event->buttons() == Qt::LeftButton) ) { //这里为顶部标题栏的高度 if (m_point.ry() <= 66) this->move(event->globalPos() - m_point); event->accept(); }}void MainWindow::mouseReleaseEvent(QMouseEvent * event){ if(event->button() == Qt::LeftButton) m_mousepressed = false;}
bool m_mousepressed = false; QPoint m_point; void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event);
这里利用mouseEvent写入时,根据的是鼠标的位置对高度/宽度判断,进行窗体移动。不清楚Qt的移动机制,很有可能在别的控件移动时触发该事件,不推荐
利用eventFliter
利用Qt机制的事件过滤器,判断我们点击哪个控件进行的移动,同时对其做出移动处理。
this->_title_bar = new CTitleBar; this->_title_bar->widget_container()->setObjectName("title_bar"); this->_title_bar->widget_container()->installEventFilter(this);
bool MainWindow::eventFilter(QObject * watched, QEvent * event) { auto cur_widget = static_cast<QWidget *> (watched); auto cur_event = static_cast<QMouseEvent *>(event); if (cur_widget->objectName() == QString("title_bar")) if (event->type() == QEvent::MouseMove) { //这里进行移动事件 } return QMainWindow::eventFilter(watched,event);}
这里根据objectName() == QString(“title_bar”)的控件,进行移动处理,
if (event->type() == QEvent::MouseMove) { //这里进行移动事件}
写入需要进行的移动事件。
移动事件的封装调用
一个程序往往需要有多个窗体进行移动,这里我们将其需要进行的移动封装成一个函数,多次调用即可,减少冗杂
void set_window_moved(QWidget* target, QMouseEvent* event, int num);
方法的实现:
首先我们需要引入,h文件
#include "Shlobj.h"
void set_window_moved(QWidget *target, QMouseEvent * event, int num){ if (ReleaseCapture() && target->isMaximized() == false) SendMessage(HWND(target->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); event->ignore();}
函数的调用
bool MainWindow::eventFilter(QObject * watched, QEvent * event) { auto cur_widget = static_cast<QWidget *> (watched); auto cur_event = static_cast<QMouseEvent *>(event); if (cur_widget->objectName() == QString("title_bar")) if (event->type() == QEvent::MouseMove) set_window_moved(static_cast<QWidget *>(this), cur_event, 0); return QMainWindow::eventFilter(watched,event);}
到此结束。
阅读全文
0 0
- Qt软件开发文档19---无边框窗体的自定义移动
- qt 移动无边框的窗体
- Qt实现无边框窗体的移动
- Qt:移动无边框窗体
- Qt - 移动无边框窗体
- Qt移动无边框窗体
- Qt:移动无边框窗体
- Qt 无边框、透明、可移动的个性窗体
- Qt 无边框、透明、可移动的个性窗体
- QT实现无边框的可移动窗体
- Qt 无边框、透明、可移动、的个性窗体
- Qt学习笔记:无边框窗体的移动
- Qt—移动无边框窗体
- Qt学习二:移动无边框窗体
- Qt无边框窗体移动和缩放
- 无边框窗体移动
- C# WinForm开发系列之自定义无边框窗体(最大化,最小化,关闭,拉伸和移动的相关知识)
- C# 无边框窗体的移动
- Java虚拟机类加载的解析阶段详解
- 独热编码(One-Hot Encoding)
- android下打包注意事项
- 数据分析与运维智能化学习总结
- Unsupported major.minor version
- Qt软件开发文档19---无边框窗体的自定义移动
- Vijos 1025题:小飞侠的游园方案
- suse使用vi编辑文件提示E437: terminal capability "cm" required
- D菜单栏改颜色测试
- 如何用地区性流量活动,实现无限裂变吸粉?
- 解决ubuntu16.04下的sublime text3不能使用中文输入法的问题
- 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
- 第一章 Qt入门
- tyvj-忠诚