c++ QML移动无框架ApplicationWindow,保持MouseArea

dauxcl2d  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(167)

配置(我现在可以从我的公司获得的最新版本):

*Qt 5.12

  • Red Hat 7.9 Linux服务器
  • 简体中文

我在一个项目中,窗口的标题栏不能个性化,因为我想(添加徽标,更新按钮右上角,...)。因此,我创建了一个无框架的ApplicationWindow(带有Qt.FrameLessWindowHint和Qt.Window标志),并在顶部添加一个矩形,在该矩形上添加所需的所有组件。
但是,没有窗口的原始标题栏,我无法再移动窗口。所以我添加一个MouseArea来填充我的矩形,并计算窗口的新位置,如下所示:
main.qml

  1. import QtQuick 2.12
  2. import QtQuick.Window 2.12
  3. import QtQuick.Controls 2.5
  4. ApplicationWindow
  5. {
  6. id: mainWindow
  7. property int previousX: 0
  8. property int previousY: 0
  9. property bool isFullScreen: false
  10. visible: true
  11. visibility: Qt.Window
  12. title: ""
  13. minimumWidth: 1400
  14. minimumHeight: 900
  15. flags: Qt.Window | Qt.FramelessWindowHint
  16. Rectangle
  17. {
  18. id: mainWindowTitleBar
  19. anchors
  20. {
  21. top: parent.top
  22. left: parent.left
  23. right: parent.right
  24. }
  25. width: parent.width
  26. height: 30
  27. color: "white"
  28. z: 1
  29. MouseArea
  30. {
  31. id: mouseAreaToChangePosition
  32. anchors.fill: parent
  33. onPressed:
  34. {
  35. previousX = mouseX
  36. previousY = mouseY
  37. }
  38. onMouseXChanged:
  39. {
  40. var dx = mouseX - previousX
  41. mainWindow.setX(mainWindow.x + dx)
  42. }
  43. onMouseYChanged:
  44. {
  45. var dy = mouseY - previousY
  46. mainWindow.setY(mainWindow.y + dy)
  47. }
  48. onDoubleClicked:
  49. {
  50. if (isFullScreen)
  51. {
  52. mainWindow.visibility = Qt.WindowMinimized
  53. }
  54. else
  55. {
  56. mainWindow.visibility = Qt.WindowFullScreen
  57. }
  58. isFullScreen = !isFullScreen
  59. }
  60. }
  61. }
  62. }

关于main.cpp

  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QQuickView>
  4. #include <QQmlContext>
  5. int main(int argc, char *argv[])
  6. {
  7. try
  8. {
  9. QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  10. QGuiApplication app(argc, argv);
  11. QQmlApplicationEngine engine;
  12. engine.load(QUrl("qrc:/main.qml"));
  13. if (engine.rootObjects().isEmpty())
  14. return -1;
  15. return app.exec();
  16. }
  17. catch(const std::exception& ex)
  18. {
  19. // Handle any exceptions that might occur during application execution
  20. qDebug().noquote() << "Error: " << ex.what();
  21. return 1;
  22. }
  23. }

但是,这样做,移动对我来说是不正确的,因为我不能“隐藏”一半的窗口拖动它在屏幕的边界。可接受的最小和最大位置是应用程序完全显示在屏幕上的位置。
有没有可能直接调用ApplicationWindow的事件来进一步使用这个功能?我在互联网上看到关于暴露QGuiApplication在QML中,但我不知道如何发送新位置的事件。
先谢谢你。

knsnq2tg

knsnq2tg1#

您可以通过从QML调用QWindow::startSystemMove来让窗口处理它:

  1. MouseArea {
  2. anchors.fill: parent
  3. onPressed: mainWindow.startSystemMove()
  4. }

注意:你也可以通过在Window中执行visibility: isFullScreen ? Qt.WindowFullScreen : Qt.Window和在MouseArea中执行onDoubleClicked: mainWindow.isFullScreen = !mainWindow.isFullScreen来简化全屏代码。

相关问题