gpt4 book ai didi

c++ - QPixmap 绘制性能问题

转载 作者:行者123 更新时间:2023-11-30 03:27:07 26 4
gpt4 key购买 nike

我需要重新创建 Windows 7 主题,其中应用程序窗口标题是透明的并显示模糊的屏幕内容。我的想法是捕获屏幕内容并在标题中模糊显示它们。出于这个原因,我扩展了 QQuickPaintedItem。

这是标题:

class DesktopImage : public QQuickPaintedItem
{
Q_OBJECT

Q_PROPERTY(int desktopX READ desktopX WRITE setDesktopX NOTIFY desktopXChanged)
Q_PROPERTY(int desktopY READ desktopY WRITE setDesktopY NOTIFY desktopYChanged)

public:
explicit DesktopImage(QQuickItem *parent = nullptr);

void paint(QPainter *painter) override;

int desktopX() const;
void setDesktopX(int desktopX);

int desktopY() const;
void setDesktopY(int desktopY);

signals:
void desktopXChanged();
void desktopYChanged();

private:
void grabScreensContent();

private:
QPixmap mScreensContent;
int mDesktopX;
int mDesktopY;

};

grabScreensContent() 方法顾名思义。 paint()方法实现如下:

void DesktopImage::paint(QPainter *painter)
{
QRectF target(0, 0, width(), height());
QRectF source(mDesktopX, mDesktopY, width(), height());
painter->drawPixmap(target, mScreensContent, source);
}

在 QML 方面,我使用如下类型:

DesktopContent {
id: desktop
desktopX: window.x
desktopY: window.y
width: parent.width
height: parent.height
}

如您所见,desktopX (desktopY) 属性绑定(bind)到 window x (window y) 属性,因此当用户移动窗口时,可以正确获取需要绘制的背景部分。然而,这幅画并不像人们想象的那样流畅。这是结果:

Slow pixmap paint

有人可以提出性能改进建议吗?

最佳答案

照顾renderTarget通过将其设置为 FramebufferObject .这基本上应该使其与普通 QML 渲染一样高效,但您可以使用有时很方便的 QPainter

DesktopImage::DesktopImage(QQuickItem *parent)
{
// this setting is not default
this->setRenderTarget(QQuickPaintedItem::FramebufferObject);
}

此外,如果您不需要整个屏幕,请仅在有限的屏幕区域进行操作。这可能有帮助,也可能没有帮助,具体取决于平台/实现,但我总是首先限制目标的范围,然后将源定位在其中。低水平的绘画不一定非常聪明,可能会在整个区域发生很多变化。因此,我们应该指定最小目标区域并对其进行更改(这种情况就是这样)。

void DesktopImage::paint(QPainter *painter)
{
QRectF target(mDesktopX, mDesktopY, width(), height()); // now limited
QRectF source(0, 0, width(), height()); // now within smaller target
painter->drawPixmap(target, mScreensContent, source);
}

关于c++ - QPixmap 绘制性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47631091/

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