锑砖 发表于 2025-6-4 19:55:12

实现qt 窗口无边框拖拽

无边框拖拽是参考Qt实战6.万能的无边框窗口(FramelessWindow) - Qt小罗 - 博客园的文章,对其代码进行修改而来。
使用的是qt6 所以有可能里面一些关于坐标的类需要修改一下类型
代码使用的话,我是直接让widget继承于framlessWidget,下图是效果图

相比较,我将m_movePoint变成是m_pressPoint距离鼠标的相对坐标;然后让m_bIsResizing的值由m_direction来判断是否要拉伸窗口,同时添加了一个透明的带边框的窗体border来实现预览移动而拉伸的状态,因为我将qt小罗的及时修改边框的位置和大小改成延时,所以需要有个能预览的边框来观看。
只要由鼠标按下和松开来调用其他函数,例如鼠标按下要对一些变量进行重新设置避免上次操作的影响、判断是否要拉伸窗口和让border绑定父窗口显示出border。其他函数需要自己查看
对于移动窗口的话,需要对派生类进行多几步的操作
列子:topWidget和mainWidgetLeft都是页面的边缘是我想在这些地方点击后能触发移动条件
void MainWidget::mousePressEvent(QMouseEvent* event){    int topWidgetHeight = this->topWidget->height();    int leftWidgetWidth = this->mainWidgetLeft->width();    int x = event->x();    int y = event->y();    //以上获取的数据是分别是符合条件的区域和鼠标的相对坐标    // 判断是否符合窗口移动条件    if (x setMinimumSize(50, 50);                border = new TransparentBorder();//并没有让border挂在this下面,所以得析构时得delete        border->hide();}FramelessWidget::~FramelessWidget(){        delete border;}bool FramelessWidget::event(QEvent* event){        ///        // 使得移除窗口仍能进行鼠标移动的事件        ///        if (event->type() == QEvent::HoverMove) {                QHoverEvent* hoverEvent = static_cast(event);                QMouseEvent mouseEvent(QEvent::MouseMove, hoverEvent->pos(),                        Qt::NoButton, Qt::NoButton, Qt::NoModifier);                mouseMoveEvent(&mouseEvent);                //LOG() button() == Qt::LeftButton) {                m_bIsPressed = true;                m_pressPoint = event->globalPos();//鼠标按下的绝对坐标                m_movePoint = QPoint(0, 0);//使得上次移动的相对坐标清零        }        //*        //如果m_direction不为NoNE 即 鼠标在窗口边界 那么就是要进行窗口拉伸        //*        if (m_direction != NONE) {                m_bIsResizing = true;        }        //由于使用的是 额外创建一个boder边框使得能够预览窗口的位置        // 所以得让boder知道要绑定谁,且知道他的geometry        if (m_bIsMove || m_bIsResizing) {                border->setParentRect(geometry());                border->show();//显示边框        }}void FramelessWidget::mouseMoveEvent(QMouseEvent* event){        QWidget::mouseMoveEvent(event);        m_movePoint = event->globalPos() - m_pressPoint;        //LOG()

蔡如风 发表于 2025-11-5 23:41:33

感谢,下载保存了

兑谓 发表于 2025-11-6 17:02:16

喜欢鼓捣这些软件,现在用得少,谢谢分享!

柏球侠 发表于 2025-12-11 06:48:45

喜欢鼓捣这些软件,现在用得少,谢谢分享!

套缈 发表于 2025-12-20 18:06:21

这个有用。

狙兕 发表于 2025-12-24 16:03:50

新版吗?好像是停更了吧。

丧血槌 发表于 2025-12-24 20:43:07

这个好,看起来很实用

寿爹座 发表于 2025-12-26 01:38:34

过来提前占个楼

丝甲坞 发表于 2026-1-13 16:04:04

鼓励转贴优秀软件安全工具和文档!

百谖夷 发表于 2026-1-14 03:10:01

前排留名,哈哈哈

欧阳梓蓓 发表于 2026-1-18 04:03:07

用心讨论,共获提升!

慕疼 发表于 2026-1-18 13:11:07

这个好,看起来很实用

悯拄等 发表于 2026-1-21 23:11:20

用心讨论,共获提升!

卿搞笔 发表于 2026-1-26 09:36:39

过来提前占个楼

骛扼铮 发表于 2026-1-27 05:59:48

不错,里面软件多更新就更好了

坐褐 发表于 2026-1-29 12:32:52

很好很强大我过来先占个楼 待编辑

晌集涟 发表于 2026-1-31 20:33:49

前排留名,哈哈哈

甄婉丽 发表于 2026-2-4 17:13:00

新版吗?好像是停更了吧。

貊淀 发表于 2026-2-7 22:59:44

过来提前占个楼

魄柜 发表于 2026-2-8 05:46:58

感谢分享,学习下。
页: [1] 2
查看完整版本: 实现qt 窗口无边框拖拽