找回密码
 立即注册
首页 资源区 代码 实现qt 窗口无边框拖拽

实现qt 窗口无边框拖拽

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

相比较,我将m_movePoint变成是m_pressPoint距离鼠标的相对坐标;然后让m_bIsResizing的值由m_direction来判断是否要拉伸窗口,同时添加了一个透明的带边框的窗体border来实现预览移动而拉伸的状态,因为我将qt小罗的及时修改边框的位置和大小改成延时,所以需要有个能预览的边框来观看。
只要由鼠标按下和松开来调用其他函数,例如鼠标按下要对一些变量进行重新设置避免上次操作的影响、判断是否要拉伸窗口和让border绑定父窗口显示出border。其他函数需要自己查看
对于移动窗口的话,需要对派生类进行多几步的操作
列子:topWidget和mainWidgetLeft都是页面的边缘是我想在这些地方点击后能触发移动条件
[code]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:eftButton) {                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()
您需要登录后才可以回帖 登录 | 立即注册