gpt4 book ai didi

c++ - 在自定义形状后剪辑自定义 qml 项目的子项

转载 作者:行者123 更新时间:2023-11-30 00:46:11 25 4
gpt4 key购买 nike

我有一个我创建的自定义 QQuickItem,我想创建一个圆角窗口。所以我实现了一个 QQuickPaintedItem 并导出到 QML。问题是项目的子项正在扩展项目的边界矩形,边界矩形是矩形而不是我想要的圆角矩形。这是它的样子:

enter image description here

这是我的代码:

ma​​in.qml

import QtQuick 2.7
import QtQuick.Window 2.2
import mycustomlib 1.0

Window {
id: wnd
width: 300
height: 280
visible: true
flags: Qt.FramelessWindowHint
color: "transparent"
x: 250
y: 250

MyCustomWindow {
id: playerFrame
anchors.fill: parent
radius: 25

Rectangle {
color: "beige"
anchors.margins: 5
anchors.fill: parent
}
}
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QUrl>

#include "mycustomwindow.h"

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

qmlRegisterType<MyCustomWindow>("mycustomlib", 1, 0, "MyCustomWindow");

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}

mycustomwindow.h

#ifndef MYCUSTOMWINDOW_H
#define MYCUSTOMWINDOW_H

#include <QQuickPaintedItem>

class MyCustomWindow : public QQuickPaintedItem
{
Q_OBJECT

Q_PROPERTY(int radius READ radius WRITE setRadius NOTIFY radiusChanged)

public:
MyCustomWindow(QQuickItem *parent = 0);

int radius() const;
void setRadius(int radius);

signals:
void radiusChanged();

protected:
virtual void paint(QPainter *pPainter) Q_DECL_OVERRIDE;

private:
int m_radius;
};

#endif // MYCUSTOMWINDOW_H

mycustomwindow.cpp

#include "mycustomwindow.h"

#include <QPainter>

MyCustomWindow::MyCustomWindow(QQuickItem *parent) :
QQuickPaintedItem(parent),
m_radius(0)
{
setAcceptedMouseButtons(Qt::AllButtons);
}

void MyCustomWindow::paint(QPainter *pPainter)
{
const QRect myRect(0, 0, width() - 1, height() - 1);
pPainter->fillRect(myRect, Qt::transparent);
pPainter->drawRoundedRect(myRect, m_radius, m_radius);
}

int MyCustomWindow::radius() const
{
return m_radius;
}

void MyCustomWindow::setRadius(int radius)
{
m_radius = radius;

emit radiusChanged();
}

我想要的是 child Rectangle 的角落被我的自定义形状剪裁(在这种情况下是一个圆角矩形。像这样的东西:

enter image description here

是否可以在 QML 中实现类似的功能?

最佳答案

我不知道 QQuickPaintedItem 是否可行(它应该使用填充,而不是仅使用边框),但如果不创建自定义 QSGNode(非常 hacky),唯一的方法是使用 opacitymask :

Rectangle{
id: mask
width:100
height: 100
radius: 30
color: "red"
border.color: "black"
border.width: 1
}

Item {
anchors.fill: mask
layer.enabled: true
layer.effect: OpacityMask {
maskSource: mask
}
Rectangle {
anchors.fill: parent
anchors.margins: 5
color:"yellow"
}
}

这给了你:

masked and clipped rectangle

但是使用它会消耗 GPU 任务,因为内部项目和 mask 必须先在缓冲区上绘制,然后在窗口上重新绘制,因此对于旧的移动设备或性能较差的嵌入式设备不是很好。

关于c++ - 在自定义形状后剪辑自定义 qml 项目的子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com