Qt如何实现通用控件移动
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家分享的是有关Qt如何实现通用控件移动的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在做一些项目的过程中,有一种应用场景是需要拖动设备在一个容器中,自由
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
互联网科技园
上海睿民互联网科技有限公司
科技股互联网
互联网品科技
互联网 科技公司
亿策互联网科技
华中科技大学互联网
奇酷互联网络科技公司
广州善班互联网科技
汉立互联网科技有限公司联系电话
济南华为互联网科技产业总部基地
互联网大会黑科技排名
浙江互联网科技研学营
山东有哪些互联网科技公司
合肥互联网科技公司公章图片
上海钢联属于互联网科技股吗
互联网科技包装股份有限公司上市
江苏互联网科技小贷
科技互联网专业务虚会材料
互联网科技创业计划的风险分析
青海省互联网新科技
老年人脱离互联网科技的作文
哈尔滨新华互联网科技学院
想开互联网科技公司怎么样
工业互联网山东科技大学
互联网营销推广黑科技
新氧科技和美国互联网有关系吗
江苏互联网智能科技产品出厂价
陕西九四连强互联网科技有限公司
六子台科技互联网展会