我需要重新创建Windows7主题,其中应用程序窗口标题是透明的,并显示模糊的屏幕内容。我的想法是捕获屏幕内容,并在标题中模糊显示它们。出于这个原因,我扩展了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)属性被绑定到window x (window y)属性,因此当用户移动窗口时,需要绘制的背景部分将被正确获取。然而,这幅画并不像人们想象的那样流畅。结果如下:

有人能给出一个性能改进的建议吗?
发布于 2017-12-04 20:37:21
通过将其设置为FramebufferObject来处理renderTarget。这基本上应该使它与普通的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);
}https://stackoverflow.com/questions/47631091
复制相似问题