配置(我现在可以从我的公司获得的最新版本):
*Qt 5.12
- Red Hat 7.9 Linux服务器
- 简体中文
我在一个项目中,窗口的标题栏不能个性化,因为我想(添加徽标,更新按钮右上角,...)。因此,我创建了一个无框架的ApplicationWindow(带有Qt.FrameLessWindowHint和Qt.Window标志),并在顶部添加一个矩形,在该矩形上添加所需的所有组件。
但是,没有窗口的原始标题栏,我无法再移动窗口。所以我添加一个MouseArea来填充我的矩形,并计算窗口的新位置,如下所示:main.qml
:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
ApplicationWindow
{
id: mainWindow
property int previousX: 0
property int previousY: 0
property bool isFullScreen: false
visible: true
visibility: Qt.Window
title: ""
minimumWidth: 1400
minimumHeight: 900
flags: Qt.Window | Qt.FramelessWindowHint
Rectangle
{
id: mainWindowTitleBar
anchors
{
top: parent.top
left: parent.left
right: parent.right
}
width: parent.width
height: 30
color: "white"
z: 1
MouseArea
{
id: mouseAreaToChangePosition
anchors.fill: parent
onPressed:
{
previousX = mouseX
previousY = mouseY
}
onMouseXChanged:
{
var dx = mouseX - previousX
mainWindow.setX(mainWindow.x + dx)
}
onMouseYChanged:
{
var dy = mouseY - previousY
mainWindow.setY(mainWindow.y + dy)
}
onDoubleClicked:
{
if (isFullScreen)
{
mainWindow.visibility = Qt.WindowMinimized
}
else
{
mainWindow.visibility = Qt.WindowFullScreen
}
isFullScreen = !isFullScreen
}
}
}
}
关于main.cpp
:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQmlContext>
int main(int argc, char *argv[])
{
try
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl("qrc:/main.qml"));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
catch(const std::exception& ex)
{
// Handle any exceptions that might occur during application execution
qDebug().noquote() << "Error: " << ex.what();
return 1;
}
}
但是,这样做,移动对我来说是不正确的,因为我不能“隐藏”一半的窗口拖动它在屏幕的边界。可接受的最小和最大位置是应用程序完全显示在屏幕上的位置。
有没有可能直接调用ApplicationWindow的事件来进一步使用这个功能?我在互联网上看到关于暴露QGuiApplication在QML中,但我不知道如何发送新位置的事件。
先谢谢你。
1条答案
按热度按时间knsnq2tg1#
您可以通过从QML调用QWindow::startSystemMove来让窗口处理它:
注意:你也可以通过在Window中执行
visibility: isFullScreen ? Qt.WindowFullScreen : Qt.Window
和在MouseArea中执行onDoubleClicked: mainWindow.isFullScreen = !mainWindow.isFullScreen
来简化全屏代码。