首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPixmap paint性能问题

QPixmap paint性能问题
EN

Stack Overflow用户
提问于 2017-12-04 18:19:30
回答 1查看 351关注 0票数 1

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

标题如下:

代码语言:javascript
复制
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()方法的实现如下所示:

代码语言:javascript
复制
void DesktopImage::paint(QPainter *painter)
{
    QRectF target(0, 0, width(), height());
    QRectF source(mDesktopX, mDesktopY, width(), height());
    painter->drawPixmap(target, mScreensContent, source);
}

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

代码语言:javascript
复制
DesktopContent {
    id: desktop
    desktopX: window.x
    desktopY: window.y
    width: parent.width
    height: parent.height    
}

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

有人能给出一个性能改进的建议吗?

EN

回答 1

Stack Overflow用户

发布于 2017-12-04 20:37:21

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

代码语言:javascript
复制
DesktopImage::DesktopImage(QQuickItem *parent)
{
    // this setting is not default
    this->setRenderTarget(QQuickPaintedItem::FramebufferObject);
}

此外,如果您不需要整个屏幕,请仅在有限的屏幕区域下操作。这可能会有帮助,也可能没有帮助,这取决于平台/实现,但我总是首先限制目标上的作用域,然后在其中定位源代码。低层次的绘画不一定非常智能,可能会在整个区域发生许多变化。因此,我们应该指定最小目标区域,并对其进行修改(本例是这样工作的)。

代码语言:javascript
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47631091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档