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