Qml在无帧QQuickView(QtQuick2)中的动画上闪烁

Qml flicker on animation in frameless QQuickView (QtQuick2)

本文关键字:动画 闪烁 QtQuick2 QQuickView Qml      更新时间:2023-10-16

main.cpp

#include <QGuiApplication>
#include <QQuickView>
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQuickView *view= new QQuickView;
    view->setFlags(Qt::Tool|Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);
    view->setColor(Qt::transparent);
    view->show();
    view->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

QML文件:

import QtQuick 2.0
Rectangle {
    width: 100
    height: 100
    color: "#80808080"
    Rectangle {
        width: 10
        height: 10
        anchors.centerIn: parent
        RotationAnimation on rotation {
            duration : 15000
            easing.type: Easing.Linear
            loops: Animation.Infinite
            from: 0
            to: 360
        }
    }
}

透明背景闪烁,但仅带有动画。这个例子很基础,那么问题出在哪里呢?

简短回答:将环境变量设置为 QSG_RENDER_LOOP=基本

长答案:我不知道确切的内部结构。当设置QSG_RENDER_LOOP=线程时,Qmlscene 由多个线程渲染。但某些驱动程序无法呈现流畅的动画。因此,对于未经测试的系统(x11,mesa),最初QSG_RENDER_LOOP设置为基本。由于 5.5 线程是默认值。

尝试 "view->setFlags(Qt::SplashScreen)"也许可以解决此问题,但无法调整窗口大小和移动窗口。这没有意义,但确实如此。