qt - 如何在 qml 中将半径应用于 ApplicationWindow
问题描述
我有一个关于如何在ApplicationWindow中修剪边缘的问题,我尝试使用剪辑、不透明度和 qml 语言的许多标准方法我的代码:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QtGraphicalEffects 1.13
ApplicationWindow {
id: loginPage
visible: true
opacity: 0.8
x: 732; y:245
width: 456; height: 529
color: "#3C096C"
flags: Qt.FramelessWindowHint
}
这是我想要得到的结果:
解决方案
另一种选择是使用 QWindow 的 setMask() 方法:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QWindow>
class Utils: public QObject{
Q_OBJECT
public:
using QObject::QObject;
Q_INVOKABLE void applyRadius(QWindow *window, int radius){
QRect r(QPoint(), window->geometry().size());
QRect rb(0, 0, 2 * radius, 2 * radius);
QRegion region(rb, QRegion::Ellipse);
rb.moveRight(r.right());
region += QRegion(rb, QRegion::Ellipse);
rb.moveBottom(r.bottom());
region += QRegion(rb, QRegion::Ellipse);
rb.moveLeft(r.left());
region += QRegion(rb, QRegion::Ellipse);
region += QRegion(r.adjusted(radius, 0, -radius, 0), QRegion::Rectangle);
region += QRegion(r.adjusted(0, radius, 0, -radius), QRegion::Rectangle);
window->setMask(region);
}
};
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QGuiApplication app(argc, argv);
Utils utils;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("Utils", &utils);
const QUrl url(QStringLiteral("qrc:/main.qml"));
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();
}
#include "main.moc"
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QtGraphicalEffects 1.13
ApplicationWindow {
id: loginPage
visible: true
opacity: 0.8
x: 732; y:245
width: 456; height: 529
color: "#3C096C"
flags: Qt.FramelessWindowHint
Component.onCompleted: ()=> Utils.applyRadius(loginPage, 20);
}
推荐阅读
- c# - 无需重启即可在 Win10 中动态更改触摸板“光标速度”的 API
- sql - 如何使用千位分隔符将数字格式化为 varchar?像 oracle to_char()
- php - 是否必须配置 PHP 以通过 PHP 扫描每个目录的配置 INI 文件(即在我的情况下为 .htaccess 文件)?
- jquery - 从具有相同ID的多个div中获取数据 - jquery
- typescript - NativeScript:将 XML 模板转换为 HTML
- javascript - Javascript过滤数组结果
- amazon-s3 - 将 Nuxt PWA 部署到 s3
- c++11 - 提升协议类型命名空间
- angular - 从 *ngfor 获取 'keys' 和 'input text' 到 .ts 文件
- android - 以编程方式添加菜单选项