我试图在QT应用程序中显示一个gif文件,使用链接中提供的方法:https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/widgets/movie?h=5.15
方法使用QMovie对象集在QLabel中。
这个例子很好用。
但是,如果我为应用程序启用高新闻部缩放功能,gif就会变成全部像素化。请看下面的截图。
这是我添加的行,以支持高新闻部缩放。
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);


有什么办法解决这个问题吗?
我已经尝试了以下修复方法:
setScaledSize对象的QMoviesetScaledContents(true)用于QLabel我使用的QT版本是5.15.2,平台是Windows。
发布于 2021-05-26 05:27:43
现在看来,在使用QMovie和QLabel进行缩放时,没有办法呈现锐利的gifs。我已经在QT错误跟踪器中为同样的错误提交了一个bug。
与此同时,我找到了一个行之有效的解决办法。它是利用QWidget系统中的QML,使用QQuickWidget来完成的。
让我在这里添加完整的步骤,以便对遇到此问题的其他任何人都有帮助:
首先,我们需要添加对Qml和QuickWidgets的支持。我使用CMake和。因此,我在CMakeLists.txt文件中添加了以下行。如果使用QT,则需要在.pro文件中进行等效的更改。
# I'm only adding the relevant lines for brevity
find_package(Qt5 COMPONENTS Qml QuickWidgets)
target_link_libraries(${APP_TARGET_NAME}
Qt5::Qml
Qt5::QuickWidgets)
# Note the --qmldir switch
add_custom_command (TARGET ${APP_TARGET_NAME} POST_BUILD
COMMAND ${QTDIR}/bin/windeployqt
--qmldir ${CMAKE_CURRENT_SOURCE_DIR}/qml
${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${APP_TARGET_NAME}.exe)然后在名为spinner.qml的文件夹中创建一个qml文件
import QtQuick 2.15
Rectangle {
width: 12
height: 12
AnimatedImage {
y: 5
width: 12
height: 12
id: spinner
source: "img/spinner.gif"
speed: 1.0
}
}然后使用QQuickWidget加载qml文件,并将QQuickWidget实例添加到QWidget布局中。
QHBoxLayout *main_layout = new QHBoxLayout();
auto *spinner_gif = new QQuickWidget(QUrl::fromLocalFile(":/spinner.qml"));
main_layout->addWidget(spinner_gif);
this->setLayout(main_layout);显示的gif即使在缩放时也不会被像素化,我们可以在任务管理器中看到正在使用的GPU,就像QQuickWidget所期望的那样。
发布于 2021-04-26 11:28:35
一张GIF图片的颜色不能超过256种。当您将这样的图像加载到Qt中时,它在内部用GIF表示的调色板( 256种颜色)表示,即使您的硬件可以显示更多的颜色。
这也意味着当你缩放这样的图像时,Qt不允许扩大色彩空间来渲染中间的颜色这意味着缩放的GIF图片通常看起来比缩放的高彩色图像糟糕得多。
解决这一问题的方法要么是将您从GIF图片创建的QImage转换为具有更大颜色空间的格式,然后再缩放它(使用QImage::convertToFormat),或者更好的是,根本不使用GIF图像。毕竟,GIF是30年前开发的一种格式,从来没有经过真正的更新以适应现代硬件,使用它时,您会人为地将程序限制在这种格式的功能上。
https://stackoverflow.com/questions/67261133
复制相似问题