QML 在Window下全屏的使用

本文探讨了在Windows 10环境下使用QML编写全屏应用程序的方法。通过实验三种不同的全屏实现方案,最终发现了一种既不闪烁也不影响鼠标响应的巧妙方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在Window10下使用QML写一个单机版的应用程序,整个程序需要全屏显示,所以需要覆盖Window10的任务栏。QML程序中的窗口对象选的是Window,大致有三个方法可以使程序全屏显示。
一、经过查阅文档,Qt Quick中的Window对象在Window 2.1版本及以上提供了visibility属性,只需要使用import QtQuick.Window 2.1导入Window模块,然后设置visibility属性值为Window.FullScreen即可。但是经过实际使用,这样设置的话,程序启动的时候会出现闪烁的情况,同时在程序运行中会出现多次窗口重绘,还会影响鼠标等事件的相应,个人猜测应该是QML的渲染机制还不够完善所导致的,所以这种全屏方式不合适。
二、可以直接设置Wihdow的width和height属性,分别设置为Screen.width和Screen.height,这样也可以全屏显示,但同样会出现闪烁的问题,真是无语了。
三、看来直接使用QML提供的全屏机制的话效果不是很好,那只有使用取巧的方法了。设置QML窗口对象Window的width和height属性,分别为Screen.width和Screen.height + 1,这里让窗口的高度比显示器的高度大1个像素点单位,经过测试,这样就不会出现闪烁的问题,同时也可以屏蔽鼠标和系统任务栏接触,从而达到隐藏任务栏的目的。

### 在 QML 中集成 QWidget 为了实现 `QWidget` 和 QML 的混合编程,在 C++ 端需要创建一个继承自 `QWidget` 或其子类的对象,并通过特定的方式将其暴露给 QML 使用。下面展示了一个完整的例子来说明这一过程。 #### 创建 C++ 类并注册至 QML 首先定义一个新的C++类,比如命名为 `CustomWidget`, 继承自 `QWidget`. 接着利用宏 `Q_OBJECT` 来支持信号槽机制以及属性系统等功能[^1]. ```cpp class CustomWidget : public QWidget { Q_OBJECT public: explicit CustomWidget(QWidget *parent = nullptr); }; ``` 之后在这个类的构造函数里可以初始化一些界面组件或者设置布局等操作. 为了让这个新的部件能够在 QML 文件里面被访问到, 需要将它作为单例对象或者是可实例化的类型注册进入 QML 上下文中: ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); qmlRegisterType<CustomWidget>("MyWidgets", 1, 0, "CustomWidget"); QQmlApplicationEngine engine; const QUrl url(u"qrc:/main.qml"_qs); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); } ``` 这里使用了 `qmlRegisterType()` 函数把 `CustomWidget` 注册成名为 `"CustomWidget"` 的新类型,版本号为 1.0 ,属于模块 `"MyWidgets"` #### 修改 QML 文件以包含 QWidget 接下来修改对应的 `.qml` 文件以便能够加载上述已经注册好的部件: ```qml import MyWidgets 1.0 // 导入之前声明的新模块 Window { visible: true width: 640 height: 480 CustomWidget { // 使用刚才导入进来的部件名称 anchors.fill: parent } } ``` 这段代码会尝试在一个全屏大小为 640x480 像素的应用程序窗口内填充整个区域放置我们自定义的小控件。 需要注意的是,由于 QML 是基于事件循环驱动的设计模式,因此对于任何来自原生桌面应用程序框架(如Qt Widgets)的内容都应当谨慎处理,确保不会破坏掉原有的响应模型.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值