返回

QT解决设置FramelessWindowHint后不可再调整大小的问题

后端

让你的 Qt 无边框窗口重新焕发活力:两种简单的方法来调整大小

在 Qt 中,无边框窗口以其时尚、现代的外观而备受青睐。然而,要调整这些窗口的大小可能会令人头疼,因为你失去了可以轻松拖动的边框。别担心,我们为你准备了两种简单的方法来解决这个问题,让你重获对窗口大小的掌控。

通过重写鼠标事件:一种优雅的解决方案

这种方法需要你深入了解 Qt 的内部机制,重写几个鼠标事件来监控和响应用户的鼠标交互。

按下鼠标: 当用户按下鼠标左键时,记录鼠标的按下位置。

移动鼠标: 当用户移动鼠标时,计算鼠标移动的距离,并根据这些移动实时更新窗口大小。

释放鼠标: 当用户松开鼠标左键时,更新窗口大小的调整就完成了。

void MainWindow::mousePressEvent(QMouseEvent *event) {
  if (event->button() == Qt::LeftButton) {
    m_isLeftButtonPressed = true;
    m_mousePressPosition = event->pos();
  }
}

void MainWindow::mouseMoveEvent(QMouseEvent *event) {
  if (m_isLeftButtonPressed) {
    QPoint delta = event->pos() - m_mousePressPosition;
    resize(size() + delta);
  }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event) {
  if (event->button() == Qt::LeftButton) {
    m_isLeftButtonPressed = false;
  }
}

通过 QRubberBand 类:一种更直观的体验

QRubberBand 类提供了一种更直观的窗口大小调整体验,利用可视橡皮筋来表示窗口的新大小。

按下鼠标: 当用户按下鼠标左键时,创建一个 QRubberBand 对象并设置其起始位置。

移动鼠标: 当用户移动鼠标时,更新橡皮筋的大小,反映出窗口的新大小。

释放鼠标: 当用户松开鼠标左键时,调整窗口大小以匹配橡皮筋的大小。

QRubberBand *rubberBand = new QRubberBand(QRubberBand::Rectangle, this);

void MainWindow::mousePressEvent(QMouseEvent *event) {
  if (event->button() == Qt::LeftButton) {
    m_rubberBand->setGeometry(QRect(event->pos(), event->pos()));
    m_rubberBand->show();
  }
}

void MainWindow::mouseMoveEvent(QMouseEvent *event) {
  if (m_rubberBand->isVisible()) {
    m_rubberBand->setGeometry(QRect(m_rubberBand->pos(), event->pos()).normalized());
  }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event) {
  if (event->button() == Qt::LeftButton) {
    m_rubberBand->hide();
    resize(m_rubberBand->rect().size());
  }
}

哪种方法更适合我?

选择哪种方法取决于你的个人偏好和项目要求。重写鼠标事件的方法提供了更多控制,而 QRubberBand 类的方法则更加直观。

常见问题解答

  1. 我可以同时使用这两种方法吗?

    • 不,你只能选择一种方法来实现无边框窗口大小调整。
  2. 如何处理自定义标题栏?

    • 在自定义标题栏中添加鼠标事件处理,以实现通过拖动标题栏来移动窗口。
  3. 是否有其他方法来调整无边框窗口的大小?

    • 是的,还有一些其他方法,例如使用第三方库或创建自己的自定义解决方案。
  4. 为什么我的窗口大小调整不起作用?

    • 确保你正确设置了 Qt::FramelessWindowHint,并且使用了正确的鼠标事件处理或 QRubberBand 方法。
  5. 如何使窗口大小调整更平滑?

    • 考虑使用 Qt 的动画框架来平滑窗口大小的过渡。

结论

通过实施这两种简单的方法,你就可以轻松地调整无边框 Qt 窗口的大小,增强用户体验并释放你的应用程序的全部潜力。根据你的需求做出明智的选择,并享受无障碍的窗口大小调整体验。