Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 当主窗口高度设置动画时,会出现巨大的闪烁_Qt_Animation_Qml_Flicker_Qt Quick - Fatal编程技术网

Qt 当主窗口高度设置动画时,会出现巨大的闪烁

Qt 当主窗口高度设置动画时,会出现巨大的闪烁,qt,animation,qml,flicker,qt-quick,Qt,Animation,Qml,Flicker,Qt Quick,在Qt Quick应用程序中,我希望在单击切换按钮时设置主窗口高度的动画,以便显示或隐藏一种托盘面板。主表单内容包含一个标题框、一个滑动视图及其下方的网格视图 为了达到预期效果,我在qss代码中添加了以下动画,这些动画根据切换按钮的状态运行: 并行动画 { id:一个\u开发\u连接\u切换\u窗口\u高度\u增加 跑步:错 NumberAnimation{target:main窗口;属性:“height”;to:750;easing.type:easing.InOutQuad;持续时间:500

在Qt Quick应用程序中,我希望在单击切换按钮时设置主窗口高度的动画,以便显示或隐藏一种托盘面板。主表单内容包含一个标题框、一个滑动视图及其下方的网格视图

为了达到预期效果,我在qss代码中添加了以下动画,这些动画根据切换按钮的状态运行:

并行动画 { id:一个\u开发\u连接\u切换\u窗口\u高度\u增加 跑步:错 NumberAnimation{target:main窗口;属性:“height”;to:750;easing.type:easing.InOutQuad;持续时间:500} } 平行动画 { id:一个\u开发\u连接\u切换\u窗口\u高度\u降低 跑步:错 NumberAnimation{target:main窗口;属性:“height”;to:450;easing.type:easing.InOutQuad;持续时间:500} } 当我试图打开托盘时,动画会在我的整个界面上引起巨大的闪烁。但是,当我关闭托盘时,动画根本不会引起闪烁,效果也很平滑,正如我所预期的那样

我的主窗口声明如下:

ApplicationWindow
{
id:主窗口
可见:正确
宽度:700
身高:750
颜色:“000000”
标题:qsTr(“拖放应用程序”)
标志:Qt.Window | Qt.FramelessWindowHint
....

有人能告诉我为什么我会面对这样的闪烁吗?我应该改变什么来修复它?

首先,我尝试用一个小应用程序重现你的行为,如下所示:

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    QQmlContext* context = engine.rootContext();
    // Adding the following line helps to remove the flickering
    app.setAttribute(Qt::ApplicationAttribute::AA_ShareOpenGLContexts, true);
    engine.load(QUrl("./data/main.qml"));
    return app.exec();
}

然后我激活了应用程序属性<代码> AAYSypOpenGLVENTS/<代码>,闪烁消失了。可能有很多原因导致闪烁,这可能会消除一个原因。我已经经历了一个不适合的图形卡驱动程序的闪烁。您还应该考虑在不同的机器上运行程序。


如果我的解决方案没有解决您的问题,请向我汇报。

我最终找到了一个可接受的解决方案

以下是我注意到的:

  • 在Aleph0的回复之后,我对OpenGL标志进行了研究。我注意到使用
    Qt::ApplicationAttribute::AA_UseOpenGLES
    标志完全解决了闪烁问题,但在我的例子中,它造成了一个奇怪的副作用:我的窗口中包含的所有组件的高度都变得不一致,而主窗体高度发生了变化,c在动画中使用一种抖动,即使定义了正确的锚定和最小和最大高度约束
  • 在我的主界面上,我删除了锚定并使用了布局。这解决了高度变化期间的奇怪抖动,以及几乎所有的闪烁问题。我在具有不同操作系统的不同计算机上进行了测试,在某些特定情况下,闪烁很少出现
  • 但是,如果使用OpenGLES,则在使用布局时仍会出现抖动

因此,以布局取代锚定是我的解决方案,即使效果并不完美。但至少结果是可以接受的。

感谢您的回复,不幸的是,这对我来说不起作用。事实上,这个问题似乎已经广为人知(例如,我试图在谷歌上搜索“qt快速修复调整闪烁大小”)。就好像每次都会擦除背景,或者小部件没有双缓冲,这就表明可能存在配置问题。然而,我尝试了几种解决方案,发现它们都不适用于我。最奇怪的是,我用标准的Qt小部件创建了完全相同的应用程序界面,而这个问题从未出现。你知道吗Jean MilostReymond:你试过我的程序吗?你在其他机器上试过我的程序吗?我很难帮助你,因为我在我的机器上重现了错误,设置窗口属性解决了问题。也许你可以试一下所有与OpenGL相关的应用程序属性。是的,我试过你使用的应用程序提到,无论有没有AA_ShareOpenGLContexts标志,它在我的电脑上都不会闪烁。我也在我的应用程序中使用过它们。我的窗口配置中应该缺少类似双缓冲的标志,这是我能找到的解释我的应用程序内容为何会以这种方式闪烁的唯一逻辑原因。我花了数小时在网络上搜索,wi不幸的是,我没有成功。我只找到了这样的答案:,但我真的不明白如何在我的案例中应用这些解决方案。。。
import QtQuick 2.13
import QtQuick.Controls 2.5

ApplicationWindow {
    id: mainWindow
    width: 800; height: 1000
    title: "Animation Flickers"
    visible: true
    property bool large:true
    MouseArea {
        anchors.fill: parent
        onClicked: {
            if (mainWindow.large) {
                decr.start()
            } else {
                incr.start();
            }
            mainWindow.large=!mainWindow.large;
        }
    }

    ParallelAnimation
    {
        id: incr
        running: false
        NumberAnimation { target: mainWindow; property: "height"; to: 750; easing.type: Easing.InOutQuad; duration: 500}
    }

    ParallelAnimation
    {
        id: decr
        running: false
        NumberAnimation { target: mainWindow; property: "height"; to: 450; easing.type: Easing.InOutQuad; duration: 500}
    }
}