`

[转载]解决 Qt / QML 中图像的闪烁 (Avoiding graphics flicker in Qt / QML )

QT 
阅读更多

搬家中。。。请关注 nuihq.com

转载自:http://blog.rburchell.com/2011/11/avoiding-graphics-flicker-in-qt-qml.html

It’s very common when writing QML applications to write a small stub, something like the following:

int main(int argc, char **argv)
{
QApplication application(argc, argv);
QDeclarativeView view;
view.setSource(QUrl(“qrc:/qml/main.qml”));
view.showFullScreen();
return a.exec();
}

What’s wrong with this? It’s a very subtle problem. I’ll give you a moment to think about it, and a video to see if you notice the problem. Make sure you don’t cheat.

Back already? Have you figured it out? That’s right, it flickers. Horrifically.

So what causes this? By default, QWidgets are drawn parent first, with parents drawing children. When a widget is drawn, first, it draws its background, then it draws the actual content. That background proves to be a problem, in this case.

If we add the following lines to the above example, the flicker goes away, and my eyes no longer want to bleed:
view.setAttribute(Qt::WA_OpaquePaintEvent);
view.setAttribute(Qt::WA_NoSystemBackground);
view.viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
view.viewport()->setAttribute(Qt::WA_NoSystemBackground);

NB: I’m not completely sure that adding it to both the view, and the viewport is completely necessary, but it can’t harm at least. Make sure to re-set it if you change viewports.

For completeness, here’s the full, fixed example:

int main(int argc, char **argv)
{
QApplication application(argc, argv);
QDeclarativeView view;
view.setSource(QUrl(“qrc:/qml/main.qml”));
view.setAttribute(Qt::WA_OpaquePaintEvent);

view.setAttribute(Qt::WA_NoSystemBackground);
view.viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
view.viewport()->setAttribute(Qt::WA_NoSystemBackground);

view.showFullScreen();
return a.exec();
}

(If you’re curious, Qt::WA_OpaquePaintEvent basically implies that you’ll repaint everything as necessary yourself (which QML is well behaved with), and Qt::WA_NoSystemBackground tells Qt to nicely not paint the background.)

NB: on Harmattan (and Nemo Mobile) at least, make sure you always use QWidget::showFullScreen(). The compositor in use there unredirects fullscreen windows (meaning no compositor in the way), so you get faster drawing performance, and every frame counts.

分享到:
评论

相关推荐

    基于PathView,Qt/QML做的一个可以无限滚动的日历控件

    基于PathView,Qt/QML做的一个可以无限滚动的日历控件 基于PathView,Qt/QML做的一个可以无限滚动的日历控件 基于PathView,Qt/QML做的一个可以无限滚动的日历控件 基于PathView,Qt/QML做的一个可以无限滚动的...

    Qt/QML 翻转效果实例

    在本文中,我们将深入探讨如何使用Qt/QML实现翻转效果。Qt是一个强大的跨平台应用程序开发框架,而QML是其内置的一种声明式语言,用于构建用户界面。在这个实例中,我们将关注如何利用QML创建一个具有翻转效果的列表...

    Qt / Qml 中支持多国语言

    在开发跨地域的应用程序时,...总的来说,Qt 和 Qml 提供了一套完整的解决方案来处理多国语言支持,无论是在传统的 C++ 界面还是现代的 Qml 界面设计中,都能够灵活地实现动态翻译,从而让应用能够更好地服务全球用户。

    Qt/QML使用WebEngine展示的百度ECharts图表Demo

    Qt/QML使用WebEngine展示的百度ECharts图表Demo Qt/QML使用WebEngine展示的百度ECharts图表Demo Qt/QML使用WebEngine展示的百度ECharts图表Demo Qt/QML使用WebEngine展示的百度ECharts图表Demo Qt/QML使用...

    一个摄像头camera的Qt/QML工程

    在Qt中,多媒体模块(multimedia)为开发者提供了处理音频、视频以及摄像头功能的接口。 1. **Qt多媒体模块(Multimedia Module)** Qt多媒体模块是Qt库的一部分,它提供了丰富的功能来处理媒体内容。在这个工程中...

    qt/qml MediaPlayerDemo

    总的来说,"qt/qml MediaPlayerDemo"是一个学习和实践如何在Qt中使用QML和QtMultimedia开发多媒体播放器的好例子。通过这个项目,你可以了解到QML的声明式编程,以及Qt框架在多媒体处理方面的强大能力。

    基于Qt/QML的微博客户端源码

    【基于Qt/QML的微博客户端源码】是一个利用Qt框架,特别是其QML(Qt Quick)模块开发的应用程序,用于实现对新浪微博的访问。这个项目结合了Qt C++、QML和JavaScript三种技术,旨在创建一个跨平台的微博客户端。通过...

    Qt6 QML Book/扩展QML/FileIO实现示例源码

    在Qt6的QML环境中,开发人员可以利用强大的QML语言来构建用户界面,并通过与C++的交互来处理底层系统功能,如文件I/O操作。本示例源码主要展示了如何在QML中进行文件读写,为QML应用程序提供更丰富的功能。 **一、...

    Qt6 QML Book/网络设置/Web Sockets示例源码

    在本文中,我们将深入探讨Qt6中的QML网络设置,特别是关于Web Sockets的应用。Qt6是Qt框架的最新版本,提供了丰富的功能和性能优化,而QML是Qt的声明式用户界面语言,使得UI设计变得直观且高效。在Qt6 QML中,Web ...

    qt/qml粒子系统实现的爱心代码

    QT/QML是一种强大的图形用户界面开发框架,尤其适用于创建丰富的、动态的可视化应用。在这个案例中,我们将深入探讨如何利用QML实现一个粒子系统来创建一个动态的爱心效果。粒子系统在游戏开发和视觉设计中广泛应用...

    Qt-Qml-Calendar_qml_QT_qml日历控件_calendar_

    在本文中,我们将深入探讨如何在Qt框架下利用QML(Qt Quick)开发日历控件。QML是Qt提供的一种声明式语言,用于构建用户界面,它与C++结合,使得开发高效、灵活且美观的应用程序变得轻而易举。 标题"Qt-Qml-...

    Qt6 QML Book/Qt C++/样板应用程序示例源码

    《Qt6 QML Book》是一本深入探讨Qt6框架中QML和C++结合使用的专业书籍,其中包含了大量的示例源码供读者学习和实践。Qt6是Qt框架的最新版本,提供了许多改进和新特性,尤其是在QML方面,使得用户界面设计变得更加...

    Qt6 QML Book/扩展QML/使用FileIO示例源码

    在"Qt6 QML Book/扩展QML/使用FileIO示例源码"中,开发者可以学习到如何在QML中与本地文件系统进行交互。QML本身并不直接支持文件I/O操作,但可以通过与C++的结合,利用C++的文件操作功能来实现。具体来说,我们可以...

    Qt / Qml 实现历史编辑器 ( 支持历史搜索 & 关键字匹配 )

    在本文中,我们将深入探讨如何使用Qt和Qml实现一个具有历史编辑器功能的应用程序,该编辑器支持历史搜索和关键字匹配。这个编辑器能够帮助用户快速查找和访问过去的输入记录,通过类似搜索引擎的关键字排序功能,...

    QmlBook-In-Chinese (1).pdf

    QML是一种用于设计用户界面的声明式脚本语言,主要基于Qt框架。它允许开发者用简洁的语法构建动态、流畅的界面。《QmlBook》作为一本关于QML的教材,涵盖了QML的基础知识、高级技巧、以及与其他技术的整合方法。 在...

    Qt6 QML Book/多媒体/播放媒体/播放视频示例源码

    在本文中,我们将深入探讨如何使用Qt6 QML进行多媒体播放,特别是针对视频播放的示例源码。Qt6是一个强大的跨平台应用程序开发框架,QML是其的一部分,用于构建用户界面,它允许以声明性的方式描述UI。当我们谈论...

    Qt / Qml 中捕获(中文)输入法事件(按下 & 提交)

    最近工作中遇到一个奇怪的问题: 本来想在 TextEdit ( QTextEdit ) 中捕获一下键盘按键按下的事件。 然而,当输入法为英文时( 正常输入字符 ),可以捕获到按键事件,但当我切换到中文时,弹出输入法选框后,却...

    Qt6 QML Book/动态QML/跟踪动态对象示例源码

    在提供的示例源码"Qt6 QML Book/动态QML/跟踪动态对象示例源码"中,我们可能会看到以下几个关键知识点: 1. **对象的动态创建**:在QML中,可以通过JavaScript代码来动态创建新的QML元素。例如,可以使用`Component...

    Qt6 QML Book/多媒体/捕捉图像示例源码

    在本资源中,我们关注的是Qt6框架中的QML组件,特别是关于多媒体处理和图像捕捉的示例源码。QML是Qt的一个重要部分,它允许开发者以声明式的方式编写用户界面,使得UI设计和逻辑控制更为直观和简洁。Qt6作为最新版本...

    qt+qml+vue构建应用程序示例

    在本文中,我们将深入探讨如何使用Qt、QML和Vue.js技术来构建跨平台的应用程序。这三种技术的结合提供了一种强大而灵活的开发方案,使得开发者可以充分利用各自的优势,构建出美观、高效且易于维护的应用。 首先,...

Global site tag (gtag.js) - Google Analytics