首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当主窗口高度是动画时,巨大的闪烁

当主窗口高度是动画时,巨大的闪烁
EN

Stack Overflow用户
提问于 2019-09-12 23:44:11
回答 2查看 1.2K关注 0票数 1

在Qt快速应用程序中,我希望在单击切换按钮时将主窗口高度动画化,以显示或隐藏一种托盘面板。主表单内容包含标题框架、滑动视图和下面的网格视图。

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

代码语言:javascript
运行
复制
ParallelAnimation
{
    id: one_dev_connected_toggle_window_height_increase
    running: false
    NumberAnimation { target: mainWindow; property: "height"; to: 750; easing.type: Easing.InOutQuad; duration: 500}
}

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

当我试图打开托盘时,动画会在我的整个界面上引起巨大的闪烁。然而,当我关闭托盘,动画不会引起任何闪烁,效果是平滑的,正如我所预期的。

我的主窗口声明如下:

代码语言:javascript
运行
复制
ApplicationWindow
{
    id: mainWindow
    visible: true
    width: 700
    height: 750
    color: "#000000"
    title: qsTr("Drag&Drop App")
    flags: Qt.Window | Qt.FramelessWindowHint

    ....

有人能解释我为什么会面临这样的闪光灯吗?我该换什么来修复它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-30 12:33:30

利用这些参数,我终于找到了一个可以接受的解决方案。

我注意到的是:

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

因此,在我的情况下,用布局代替锚是解决方案,即使它并不完美。但至少结果是可以接受的。

票数 1
EN

Stack Overflow用户

发布于 2019-09-13 06:35:38

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

main.cpp

代码语言:javascript
运行
复制
#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();
}

main.qml

代码语言:javascript
运行
复制
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}
    }
}

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

如果我的解决方案没有解决你的问题,请报告。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57915703

复制
相关文章

相似问题

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