Qt如何实现通用控件移动
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章给大家分享的是有关Qt如何实现通用控件移动的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在做一些项目的过程中,有一种应用场景是需要拖动设备在一个容器中,自由
千家信息网最后更新 2025年12月02日Qt如何实现通用控件移动
这篇文章给大家分享的是有关Qt如何实现通用控件移动的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一、前言
在做一些项目的过程中,有一种应用场景是需要拖动设备在一个容器中,自由拖动摆放到合适的位置,然后保存对应设备的坐标位置信息,在软件启动好以后自动加载配置好的坐标位置信息,将每个设备移动到对应的位置,最好背景图在来个3D鸟瞰图,或者来点三维实景,搞得很炫。这就是这个控件的来由,还有一种场景比如组态软件,自由拖动设计自定义控件和图片等,也需要在容器中拖来拖去的,如果有一个通用的控件移动类,直接new出来传入需要移动的widget,这样就方便多了,不需要每个控件或者窗体自身去实现这种通用的重复的功能。
二、代码思路
#include "movewidget.h"#include "qevent.h"#include "qdebug.h"MoveWidget::MoveWidget(QObject *parent) : QObject(parent){ lastPoint = QPoint(0, 0); pressed = false; leftButton = true; inControl = true; widget = 0;}bool MoveWidget::eventFilter(QObject *watched, QEvent *event){ if (widget != 0 && watched == widget) { QMouseEvent *mouseEvent = (QMouseEvent *)event; if (mouseEvent->type() == QEvent::MouseButtonPress) { //如果限定了只能鼠标左键拖动则判断当前是否是鼠标左键 if (leftButton && mouseEvent->button() != Qt::LeftButton) { return false; } //判断控件的区域是否包含了当前鼠标的坐标 if (widget->rect().contains(mouseEvent->pos())) { lastPoint = mouseEvent->pos(); pressed = true; } } else if (mouseEvent->type() == QEvent::MouseMove && pressed) { //计算坐标偏移值,调用move函数移动过去 int offsetX = mouseEvent->pos().x() - lastPoint.x(); int offsetY = mouseEvent->pos().y() - lastPoint.y(); int x = widget->x() + offsetX; int y = widget->y() + offsetY; if (inControl) { //可以自行调整限定在容器中的范围,这里默认保留20个像素在里面 int offset = 20; bool xyOut = (x + widget->width() < offset || y + widget->height() < offset); bool whOut = false; QWidget *w = (QWidget *)widget->parent(); if (w != 0) { whOut = (w->width() - x < offset || w->height() - y < offset); } if (xyOut || whOut) { return false; } } widget->move(x, y); } else if (mouseEvent->type() == QEvent::MouseButtonRelease && pressed) { pressed = false; } } return QObject::eventFilter(watched, event);}void MoveWidget::setLeftButton(bool leftButton){ this->leftButton = leftButton;}void MoveWidget::setInControl(bool inControl){ this->inControl = inControl;}void MoveWidget::setWidget(QWidget *widget){ if (this->widget == 0) { this->widget = widget; this->widget->installEventFilter(this); }}三、效果图

感谢各位的阅读!关于"Qt如何实现通用控件移动"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
控件
移动
位置
坐标
容器
设备
鼠标
自由
信息
内容
场景
更多
篇文章
软件
不错
合适
实用
代码
像素
函数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
合肥ios系统软件开发
软件开发工程师中专
mysql数据库客户端宽度
网络安全践于
数据通信网络技术考试卷
中国互联网和科技公司哪个好
美国网络安全框架构成
应届软件开发简历模板下载
上海网络安全审计系统咨询代办
多功能网络技术开发口碑推荐
大力发展管理会计的软件开发
中国外运的软件开发
sql数据库导数时间不走
74422161服务器号
网络安全如何打击不良网站
软件开发控制软件
怎样把数据库放到vb里面
新能源网络技术价格表格
深圳市睿云网络技术有限公司
小米11无线网络技术第几代
北京星物云联软件开发
会计电算化的四种软件开发方法
光明区网络技术进出口服务费
dsp底层软件开发工程师
计算机网络技术与工程造价
我的世界枪械服务器启动器
mysql数据库运维工具
金华软件开发计划
数据库技术应用难学吗
天津数据网络技术