在Qt快速应用程序中,我希望在单击切换按钮时将主窗口高度动画化,以显示或隐藏一种托盘面板。主表单内容包含标题框架、滑动视图和下面的网格视图。
为了达到预期效果,我在qss代码中添加了以下动画,这些动画根据我的切换按钮状态运行:
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}
}当我试图打开托盘时,动画会在我的整个界面上引起巨大的闪烁。然而,当我关闭托盘,动画不会引起任何闪烁,效果是平滑的,正如我所预期的。

我的主窗口声明如下:
ApplicationWindow
{
id: mainWindow
visible: true
width: 700
height: 750
color: "#000000"
title: qsTr("Drag&Drop App")
flags: Qt.Window | Qt.FramelessWindowHint
....有人能解释我为什么会面临这样的闪光灯吗?我该换什么来修复它呢?
发布于 2019-09-30 12:33:30
利用这些参数,我终于找到了一个可以接受的解决方案。
我注意到的是:
Qt::ApplicationAttribute::AA_UseOpenGLES标志完全解决了闪烁问题,但在我的情况下,它造成了一个奇怪的副作用:当主窗体高度发生变化时,包含在窗口中的所有组件的高度变得不一致,即使定义了正确的锚定、最小和最大高度约束,也会造成某种抖动。因此,在我的情况下,用布局代替锚是解决方案,即使它并不完美。但至少结果是可以接受的。
发布于 2019-09-13 06:35:38
首先,我尝试用一个小应用程序来再现您的行为,如下所示:
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();
}main.qml
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,闪烁消失了。闪烁的原因可能有很多,而这可能只是消除了一个原因。我已经经历了一个不合适的图形卡驱动程序闪烁。您还应该考虑在不同的机器上运行您的程序。
如果我的解决方案没有解决你的问题,请报告。
https://stackoverflow.com/questions/57915703
复制相似问题