Qt Example各例子技术点说明(一)

本文详细解析Qt官方示例,涵盖绘画技术如仿射、圆环、图像融合,窗口部件如计时器、计算器、日历,动画与状态机应用,如动画瓷砖、动画时钟、状态切换,以及图形视图框架的布局与交互。通过这些例子,学习Qt的各种核心功能和最佳实践。

说明:

1. widgets\painting 部分

1.1. affine工程

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\affine

该工程演示了Qt绘图中的仿射、平移、旋转的功能,该例子也展示了如何利用QCommonStyle绘制自定义的窗体部件。对该工程的具体剖析参见《Qt Examples之affine工程难点、亮点汇总》。​​​​​​

1.2 .Concentric Circle工程

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\aconcentriccircles

该工程显示了如何利用 浮点精度和抗锯齿来提高渲染质量。主窗体通过组合浮点和抗锯齿来在不同窗体部件分别显示不同组合下的渲染效果。

1.3 composition工程

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\composition

该工程显示了两张图像即源图像和目标图像通过不同的模式(QPainter::CompositionMode)融合后产生的显示效果,代码分析可参考《Qt 图像叠加模式[composition Modes]官方例子 源码解读》

、 《Qt Examples之imagecomposition工程分析》、《QPainter类的CompositionMode各值含义》

 1.4 imagecomposition工程 

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\imagecomposition

​该工程显示了两张图像即源图像和目标图像通过不同的模式(QPainter::CompositionMode)融合后产生的显示效果,代码分析可参考《Qt Examples之imagecomposition工程分析

​1.5  deform工程

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\deform

该工程展示了如何操纵QPainterPath元素。

1.6 fontsampler

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\fontsampler

该工程展示了:

  • 利用QFontDatabase类枚举安装在本机上的所有字体、字体风格、字体属性。
  • 利用QPrinter、QPrintDialog、QPrintPreviewDialog和打印有关的类的使用。
  • 展示了QProgressDialog类用法。一个很好用的进度对话框类。
  • qAsConst函数的使用。如果对该函数不懂,请参看《foreach、qAsConst用法总结》。

1.7 gradients

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\gradients

该工程展示了QGradient及其子类QConicalGradient, QLinearGradient, and QRadialGradient实现各种渐变效果。

1.8 pathstroke

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\pathstroke

该工程展示了QPainterPathStroker类的使用,工程里面用到一些数学。

1.9 transformations

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\painting\transformations

该工程展示了QPainter类进行旋转、缩放、平移 的绘图操作。

2. widgets\widgets部分

本大节展示了和Qt中的wiget相关的技术点,如:widget创建、属性、定时器、绘图等等。

2.1 wiggly

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\wiggly
该工程讲解了一个轻量级的定时器QBasicTimer类的用法,另外关于Qt的定时器类的用法总结,请参考《Qt定时器QBasicTimer、startTimer、QTimer使用总结》博文。

2.1 calculator

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\calculator
该工程用Qt实现了一个计算器。从该工程要学到如下知识点:

  •  QLineEdit 的setAlignment可以设置字符串右对齐。
  •  QLineEdit 的 setMaxLength设置编辑框最大字符数。
  • SLOT槽函数作为参数传给createButton函数,这种传参方法本人很少用,觉得很新颖。
  • \302\261,\303\267、\303\227,x\302\262是什么意思,怎么计算来的,参见                        《Qt控件中打印特殊字符》文章。

2.2 calendarwidget

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\calendarwidget
该工程用Qt实现了日历控件。从该工程要学到如下知识点:

  • 日历类QCalendarWidget用法。
  • QLocale类的使用,如:QLocale::Language、QLocale::Country枚举使用。

2.3 charactermap

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\charactermap
从该工程要学到如下知识点:

  • QFontComboBox类控件用法。该控件继承QComboBox,不用QFontDatabase搜索遍历字体库,就能直接加载所有系统中的字体。
  • QScrollArea类用法。
  • QFontDatabase类用法。
  • QSignalBlocker类用法。 
  • QLineEdit类的setClearButtonEnabled设置为true后,右侧显示一个❌的清空按钮图
  •  QToolTip::showText显示工具提示。

2.4 codeeditor

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\codeeditor
本工程实现代码编辑器及代码行号功能。从该工程要学到如下知识点:

  •     QPlainTextEdit使用
  •     QWidget类的contentsRect用法。
  •     QWidget类的setViewportMargins。
  •      QTextEdit::ExtraSelection结构体用法。
  •     QPlainTextEdit类的firstVisibleBlock、blockBoundingGeometry、blockBoundingRect。
  •     QTextBlock类的blockNumber、isValid、isVisible使用。

2.5 digitalclock

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\digitalclock
本工程实现实现了一个数字式的时钟。从该工程要学到如下知识点:

  • QLCDNumber类使用。

2.6 elidedlabel

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\elidedlabel
从该工程要学到如下知识点:

  •    QFrame 类使用。
  •     QTextLayout 、QTextLine类使用。

2.7 icons

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\icons

本例通过在不同平台风格(如:window vista、fusion)显示icon,icon在不同平台像素尺寸下显示的效果。通过本工程要学到如下知识点:

  • QCommandLineParser类的使用
  •     QActionGroup的使用
  •     QButtonGroup的使用
  •     QStyleFactory的使用
  •     如何从QSpinBox派生子类
  •     QIcon::Mode、QIcon::State枚举值的使用。
  •     QWidget的nativeParentWidget()含义、用法,具体参见:《QWidget的parentWidget、window、nativeParentWidget区别与理解
  •     QWindow类的screenChanged信号
  •     QStyle的PixelMetric枚举的使用

2.8 imageviewer

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\imageviewer

本例通过QImageReader、QImageReader加载、保存图片功能。通过本工程展示了如下知识点的用法:

  •   通过QImageReader读取图片到 QLabel并加入QScrollArea进行显示,以便能放下大图。
  •   调用QLabel类的adjustSize()方法(从QWidget继承过来的)以使图片铺满整个QLabel对象。
  •   QStandardPaths获取一些标准的路径、目录。
  •   QImageReader、QImageWriter的supportedMimeTypes函数返回支持的Mime Type列表。
  •   QFileDialog的setMimeTypeFilters、selectMimeTypeFilter对Mime Type的操作函数。
  •   利用QPrintDialog、QPrinter进行图片的打印预览和打印。

2.9 lineedits

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\lineedits

本例子展示了QLineEdit类常用属性用法。通过本例子展示了:

  •         QLineEdit类的EchoMode模式用法。
  •             QLineEdit类和QIntValidator或QDoubleValidator配合使用实现整形、双精度浮点型数据校验器使用。
  •              QLineEdit类左对齐、中间对齐、右对齐属性。
  •              QLineEdit类的setInputMask函数设置掩码。如:在编辑框中的只能是日期格式、License格式、电话号码格式。

2.10 mousebuttons

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\mousebuttons

 本例展示了鼠标按下、滚动滚动,对各个鼠标键的监控功能。

2.11 movie

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\movie

本例展示了QMovie加载无音频的动画,进行播放、暂停、停止功能。

2.12 qttablet

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\qttablet

本例子展示了Qt实现平板、触控笔功能,如何处理tabletEvent事件。

2.13 scribble   

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\scribble

本例子展示了如何在窗体上绘制图片,并在图片上按住鼠标、移动鼠标随机画线
并保存、打印图片。

2.14 shapedclock

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\shapedclock

本例子绘制了一个能根据时间走动的表盘式时钟。本例子需要学习到如何利用QRegion、setMask
Qt::WA_TranslucentBackground(在windows平台下一般需要结合Qt::FramelessWindowHint 使用)将窗体绘制为圆形

2.15 sliders

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\sliders

本例子展示了QScrollBar、QDial、QSlider用法。

2.16 spinboxes

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\spinboxes

本例子展示了各种SpinBox用法。尤其要注意如下函数的用法:
    1:SpinBox的setSpecialValueText将最小值自动用一个有特殊含义的文本串表示。
    2:SpinBox的ssetGroupSeparatorShown。当数值超过1000时,自动每三个数字加一个分隔                符,如1,000, 101, 000。
    3: SpinBox的ssetDisplayIntegerBase.设置SpinBox显示数值的进制,如:16进制显示数值
    4:QDateEdit、QTimeEdit用法。
    5:SpinBox的ssetDecimals设置显示的数值精度,如:三位小数、四位小数等。

2.17 tetrix

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\tetrix

本工程通过实现一个俄罗斯方块的游戏,展示了QLCDNumber、QFrame、QBasicTimer类的用法。

2.18 tooltips

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\tooltips

本工程展示QToolBox用法。

2.19 validators

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\validators

本工程展示了QValidator及其子类QIntValidator、 QDoubleValidator用法。

2.20 windowflags

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\windowflags

本工程展示Qt::windowflags用法,Qt::windowflags更多用法,请参见

Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总

2.21 analogclock

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\widgets\analogclock

本工程利用QPainter绘制了一个时钟,同2.14的shapedclock工程绘制的时钟类似。

3. widgets\animation部分

本节要用到Qt The State Machine Framework、The Animation Framework框架即Qt的动画、状态机框架知识。详细的内容请在Qt Assistant 的搜索页签中输入The State Machine Framework、The Animation Framework进行查看。可以参考简约版《Qt状态机框架知识点总结

3.1 animatedtiles

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\animation\animatedtiles

展示了Qt的状态机相关类QState、QStateMachine及动画相关类QParallelAnimationGroup、QPropertyAnimation类的用法。本工程一大亮点是paint函数利用QStyleOptionGraphicsItem实现自绘按钮鼠标移动按下状态,具体剖析参见

QStyleOptionGraphicsItem实现自绘按钮鼠标移动按下状态

3.2 easing工程

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\animation\easing

通过本例子,要学习到:

  • 如何从QPropertyAnimation继承派生出自己的属性动画子类,参见本工程的Animation类的实现。
  • 如何利用Qt的QEasingCurve类进行动画插值。
  • 通过类的staticMetaObject元对象静态成员及元对象的indexOfEnumerator方法获取枚举对象QMetaEnum。
  • QMetaEnum类对枚举值中的key和字符串之间的转换、获取枚举值的个数。

3.3 states

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\animation\easing

通过本例子,要学习到:

  • QGraphicsProxyWidget用法。
  • QGraphicsLinearLayout、QGraphicsLayout布局器。
  • QGroupBox的setFlat方法。
  • QStateMachine、QState、QSequentialAnimationGroup、QPropertyAnimation用法。

3.4 stickman

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\animation\stickman

通过本例子,要学习到:

  • QStateMachine、QState、QPropertyAnimation、QParallelAnimationGroup用法。
  • 如何自定义QEventTransition、QSignalTransition。

本例子详细剖析参见《Qt Examples 之stickman工程分析》。

3.5 moveblocks

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\animation\moveblocks

通过本例子,要学习到:

  • QStateMachine、QState、QPropertyAnimation、QParallelAnimationGroup、QSequentialAnimationGroup用法。
  • 如何子类化QEvent、QAbstractTransition、QState。

本例子的具体剖析参见:《Qt Examples 之moveblocks工程分析

3.6 sub-attaq

该工程存放在Qt安装目录下的Examples\Qt-XX.XX.XX\widgets\animation\sub-attaq

通过本例子,要学习到:

  • QStateMachine、QState状态机相关类的用法。
  • QPropertyAnimation、QParallelAnimationGroup、QSequentialAnimationGroup用法及动画类的pause、resume、start、stop方法。
  • 如何子类化QEvent、QAbstractTransition、QState。
  • QKeyEventTransition。
  • Q_DISABLE_COPY用法及含义。
  • QGraphicsScene类可以有多个视图。

4 widgets\statemachine

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\animation\statemachine

本节要用到Qt The State Machine Framework,详细的内容请在Qt Assistant 的搜索页签中输入The State Machine Framework进行查看。可以参考简约版《Qt状态机框架知识点总结

4.1 eventtransitions

该工程存放在Qt安装目录下的

Examples\Qt-5.14.1\widgets\statemachine\eventtransitions

通过本例子,要学习到:

  • QStateMachine、QState类的使用及关系。
  • QEventTransition用法。
  • QEventTransition怎么引起各个QState之间的切换。

4.2 factorial

该工程存放在Qt安装目录下的

Examples\Qt-5.14.1\widgets\statemachine\factorial

这个例子是通过状态机及状态类求阶乘。通过本例子,要学习到:

  • QStateMachine、QState类的使用及关系。
  • 如何子类化QSignalTransition。
  • QStateMachine::SignalEvent类的理解。
  • Qt元系统Q_PROPERTY的应用和宏Q_SIGNALS的作用。

4.3 pingpong

该工程存放在Qt安装目录下的

Examples\Qt-5.14.1\widgets\statemachine\pingpong

这个例子是通过状态机及状态类求阶乘。通过本例子,要学习到:

  • QStateMachine、QState类的使用及关系。
  • 如何子类化QState。
  • 如何子类化QEvent。
  • 如何子类化QAbstractTransition。

4.4 trafficlight

该工程存放在Qt安装目录下的

Examples\Qt-5.14.1\widgets\statemachine\trafficlight

这个例子是通过状态机及状态类实现了一个交通信号灯。通过本例子,要学习到:

  • QStateMachine、QState类的使用及关系。
  • QState、QTimer类的交互。
  • QFinalState类的使用。

4.4 rogue

该工程存放在Qt安装目录下的

Examples\Qt-5.14.1\widgets\statemachine\rogue

这个例子是通过状态机及状态类实现了移动字符的小游戏。通过本例子,要学习到:

  • QStateMachine、QState类的使用及关系。
  • 如何子类化QEventTransition。
  • QFinalState类的使用。
  • QEvent::StateMachineWrapped用法

4.4 twowaybutton

该工程存放在Qt安装目录下的

Examples\Qt-5.14.1\widgets\statemachine\twowaybutton

这个例子是通过状态机及状态类实现了按钮文字on、off切换。通过本例子,要学习到:

  • QStateMachine、QState类的使用及关系。

5 widgets\graphicsview

本大节展示了Qt场景、视图、图形项技术点。要用到Qt Graphics View Framework框架。详细的内容请在Qt Assistant 的搜索页签中输入Graphics View Framework进行查看。

5.1 anchorlayout

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\anchorlayout

本工程展示了QGraphicsProxyWidget、QGraphicsAnchorLayout用法。利用QGraphicsProxyWidget在场景视图中创建显示QWidget对象,然后利用QGraphicsAnchorLayout对这些创建的QWidget对象进行布局排列。

5.2 basicgraphicslayouts

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\basicgraphicslayouts

本工程展示了如下技术点:

  • QGraphicsLinearLayout布局器用法。
  • 如何从QGraphicsLayoutItem派生实现子类。
  • 如何从QGraphicsItem派生实现子类。

5.3 chip

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\chip

本工程展示了如下技术点:

  • 如何子类化QGraphicsView。
  • 如何对QGraphicsView视图缩放、旋转、平移、重置。
  • QGraphicsView和QGraphicsScene如何互动。
  • 在QGraphicsScene中添加QGraphicsItem及相互之间的互动。
  • 如何子类化、自定义QGraphicsItem、拖动、选择。
  • 根据QGraphicsItem不同的缩放率,在QGraphicsItem表面绘制不同内容。
  • 利用levelOfDetailFromTransform函数获取QGraphicsItem不同缩放率的用法。
  • 掌握QGraphicsItem的风格类相关函数、对象使用,如:QStyleOptionGraphicsItem。
  • 如何利用QVarLengthArray在栈上声明一个定长数组。

5.4 collidingmice

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\collidingmice

本工程通过场景、视图、项框架画出7个小老鼠,并结合定时器使这7个小老鼠在场景中不停运动,实现老鼠动画效果。展示了如下技术点:

  • 场景、视图、项交互。
  • setItemIndexMethod函数参数GraphicsScene::NoIndex、GraphicsScene::BspTreeIndex的区别。前者对场景中动画项、经常移动的项效率比后者高。
  • 当视图背景是图片时,利用视图的setCacheMode方法设置缓冲参数为QGraphicsView::CacheBackground,可以提高效率。
  • 视图其它参数设置。
  • QGraphicsScen类的advance函数和QGraphicsItem的advance函数的关系。如何利用QGraphicsItem的advance函数实现项动画。
  • 本工程中老鼠各个器官的形状是在paint函数画出来的。
  • 本工程涉及到了一些数学知识,看懂需要基本数学基础,如:高中的三角函数等。

本工程具体分析,参见《Colliding Mice碰撞老鼠工程分析》。

5.5 diagramscene

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\diagramscene

本工程实现了类似miscrosoft visio 软件的流程图组件。从本工程中要学到如下知识点:

  • 场景、视图、项如何交互。
  • 如何自定义QGraphicsTextItem、QGraphicsPolygonItem。
  • 项的一些标志设定,如:ItemIsSelectable、ItemIsMovable、ItemSendsGeometryChanges。
  • 检测项的选择、选中、碰撞、相交等。
  • 文本TextInteractionFlag各个枚举值的含义。
  • QToolBox类使用。
  • QFontComboBox字体组合框的使用。
  • QIntValidator使用。

本工程中有几个难点,具体参见《diagramscene工程难点分析》博文。

5.6 dragdroprobot

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\dragdroprobot

本工程实现一个机器人和围绕机器人一圈的随机颜色圆形item。通过按住鼠标左键对圆形item进行拖动,拖动到机器人的部位上时,机器人该部位颜色就能变为该圆形item的颜色。如果是拖动到机器人头部,且运气好的话,还能将机器人的头部换成真实人头像。从本工程中要学到如下知识点:

  • 场景、视图、项如何交互。
  • 如何自定义QGraphicsItem。
  • 设置Qt::ItemHasNoContents标志,使QGraphicsItem的paint不被Qt调用,这样对没有任何内容需要绘制的情况下,避免Qt每次调用paint函数,从而提高效率。
  • QGraphicsItem的mousePressEvent、mouseMoveEvent、mouseReleaseEvent事件使用,特别是这事件中的参数QGraphicsSceneMouseEvent的理解。
  • 动画框架QParallelAnimationGroup、QPropertyAnimation的使用。这几个动画类请参见Qt Assist中的“The Animation Framework”的描述。
  • QDrag、QMimeData拖放类、拖放技术的应用。
  • QGraphicsItem的dragEnterEvent、dragLeaveEvent、dropEvent事件使用。
  • QApplication::startDragDistance()函数的理解。

5.8 elasticnodes

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\elasticnodes

      本工程实现弹性节点示例。演示如何使用基本交互在图形中实现节点之间的边。您可以单击以拖动节点,并使用鼠标滚轮或键盘放大和缩小。点击空格键将随机化节点。该示例也是独立于分辨率的;放大时,图形仍然清晰。

从本工程中要学到如下知识点:

  • 场景、视图、项如何交互。
  • 如何自定义QGraphicsItem。
  • 视图QGraphicsView类drawBackground方法调用时机和用法。
  • 视图QGraphicsViewd类放大、缩小。
  • QGraphicsItem类的Qt::ItemIsMovable、Qt::ItemSendsGeometryChanges、Qt::DeviceCoordinateCache标志含义及用法。
  • QGraphicsItem类的itemChange函数的激发、调用条件。
  • setAcceptedMouseButtons函数用法。
  • 程序中用到std::atan2求反正切的函数,这个函数的用法,请参见《C++中反正切atan2(y,x)与atan(x)的区别》博文。
  • startTimer启动定时器及定时器响应函数timerEvent用法。关于Qt三个定时器的区别,请参见

       《Qt定时器QBasicTimer、startTimer、QTimer使用总结》。

本工程的难点是Node类的calculateForces()函数,该函数用到物理的推拉力计算原理。本工程的具体分析,参见《官方例程elasticnodes解析》博文。

5.9 embeddeddialogs

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\embeddeddialogs

本工程实现在场景中插入100个窗体部件(QGraphicsProxyWidget对象)。当鼠标在某个窗体部件对象上悬浮、移走时,利用QTimeLine对象使该窗体对象做微小的平移、转动、缩放,给人呈现出一种动画效果。从本工程中需要学到以下知识点:

  • QGraphicsProxyWidget类的使用、如何从该类派生出子类。
  • 场景视图的使用。
  • QTimeLine类用法。
  • QGraphicsProxyWidget类的paintWindowFrame函数的作用。
  • QGraphicsProxyWidget类的sceneEventFilter、installSceneEventFilter函数的用法。这两个函数类似QObject的installEventFilter、eventFilter函数,可以参考

       《installEventFilter、eventFilter函数理解》进行类比学习。

5.10 flowlayout_graphicsview

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\flowlayout_graphicsview

本工程通过QGraphicsProxyWidget,将一个字符串作为QLabel的文本插入到场景,并通过自定义的QGraphicsLayout布局器来布局这些文本QGraphicsProxyWidget表示的item对象。通过本工程要学习到如下知识点:

  • 场景视图的使用。
  • QGraphicsProxyWidget类的使用。
  • 如何从QGraphicsLayout类派生、自定义自己的布局器。
  • QStringRef类的使用。

5.11 padnavigator

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\padnavigator

本工程实现类似pad平板电脑app导航功能。点击键盘不同的键,以动画方式导航到不同界面。从本工程要学到如下知识点:

  • 利用QGraphicsRotation类和QGraphicsItem类的setTransformations方法实现绕任意轴的插值旋转。
  • QGraphicsProxyWidget用法。
  • QPropertyAnimation、QParallelAnimationGroup、QSequentialAnimationGroup类实现动画。这几个类更多示例请参见第3节中的widgets\animation部分。
  • QEventTransition、QStateMachine、QState、QHistoryState状态机及状态变换有关类用法。这几个类更多示例请参见第4节中的widgets\statemachine部分。
  • 场景、视图、项的交互。

5.12.simpleanchorlayout

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\simpleanchorlayout

       本工程演示如何利用QGraphicsAnchorLayout对QGraphicsWidget类对象进行布局。从本工程要掌握如下知识点:

  • QGraphicsAnchorLayout用法,如何利用该类对场景中的item进行布局。
  • 如何子类化QGraphicsWidget。
  • 场景、视图、项的交互。

5.13.weatheranchorlayout

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\widgets\graphicsview\weatheranchorlayout

       本工程实现天气牧场画面,通过QGraphicsAnchorLayout、QGraphicsAnchor进行布局。通过本工程需要掌握如下知识点:

  • QGraphicsAnchor类用法。
  • QGraphicsAnchorLayout用法。
  • 利用QGraphicsAnchorLayout、QGraphicsAnchor对场景中item进行布局。
  • 如何子类化QGraphicsLayoutItem类。
  • 如何子类化QGraphicsWidget类。
  • QPainter类CompositionMode各个枚举值的用法,具体参见《QPainter类的CompositionMode各值含义》博文。

6. speech

该工程存放在Qt安装目录下的

Examples\Qt-XX.XX.XX\speech

       本工程实现语音播报功能。在编辑框中输入你想播报的内容文字,就调用本地计算机的声卡将内容播报出来。这在很多场合很实用,如:公交报站、产品讲解。从本工程需要掌握如下知识点:

  • 利用QTextToSpeech类实现语音播报。
  • QLoggingCategory用法。

该工程的具体分析参见《Qt的QTextToSpeech类实现语音播报功能》博文。

由于Qt官方自带的例子很多,一下看不完,每看完一个例子,记录一个。未完,待续!

<think>好的,我现在需要处理用户的问题,关于Qt例子中出现的错误信息:“this example requires qt to be configured with -opengl desktop”。用户希望了解如何解决这个问题,或者得到相关的介绍。首先,我需要确定这个错误的原因,以及解决方法。 首先,我应该回忆Qt的OpenGL支持情况。Qt在渲染图形时,可以使用不同的后端,比如OpenGL或Raster(软件渲染)。某些Qt例子或应用程序可能依赖特定的OpenGL功能,尤其是桌面版的OpenGL,而不是OpenGL ES,这通常在嵌入式或移动设备上使用。错误信息提示需要配置Qt时启用桌面版的OpenGL支持,这可能是因为当前的Qt构建使用的是OpenGL ES或者其他不兼容的后端。 接下来,用户可能在尝试编译或运行某个Qt示例时遇到了这个错误。常见的情况是,用户可能在Linux系统下,或者在某些配置不包含桌面OpenGL的环境中使用Qt。例如,某些Linux发行版的Qt包可能默认使用OpenGL ES,或者用户在配置Qt时没有启用桌面OpenGL。 那么,解决方法应该是重新配置Qt并加上-opengl desktop选项,然后重新构建Qt。但需要注意,Qt从5.5版本以后,配置选项有所变化。-opengl选项可能在较新的版本中不再有效,而是需要通过其他方式指定OpenGL的实现。例如,在较新的Qt版本中,可能需要使用-qt-opengl desktop或其他参数,或者可能需要确保系统安装了正确的OpenGL开发包。 这时候需要分情况讨论。如果用户使用的是Qt 5.5或更早版本,可能确实可以通过在configure时添加-opengl desktop来解决。但如果是较新的版本,可能需要不同的步骤,比如安装mesa的OpenGL开发库,或者在配置时选择适当的选项。 另外,还需要考虑用户的操作系统。例如,在Windows上,OpenGL的支持可能依赖于安装的显卡驱动和SDK;而在Linux上,可能需要安装mesa-common-dev或类似的软件包。在macOS上,通常Qt会使用系统自带的OpenGL,但可能需要确认Xcode命令行工具是否安装。 此外,用户可能需要确保他们的系统支持桌面版OpenGL。例如,某些嵌入式系统或服务器环境可能没有安装相应的图形驱动,导致无法使用桌面OpenGL。 可能还需要检查Qt的构建配置是否正确。用户可能从源码构建Qt,或者在安装预编译的Qt包时选择了不包含OpenGL desktop支持的版本。例如,在Linux上,使用apt-get安装的Qt可能默认不带OpenGL桌面支持,需要从源码编译并配置相应的选项。 另外,可能的替代方案是,如果用户无法重新配置Qt,可以尝试修改示例代码的渲染后端,但这可能比较复杂,特别是对于不熟悉Qt内部机制的用户来说,重新配置Qt可能是更直接的解决方案。 总结处理步骤应该是: 1. 确认Qt版本,检查对应的配置选项是否需要-opengl desktop或其他参数。 2. 确保系统已安装所需的OpenGL开发库。 3. 重新配置Qt并启用桌面OpenGL支持,然后重新构建Qt。 4. 重新编译和运行示例程序,验证问题是否解决。 还需要注意可能的常见错误,例如配置参数的位置是否正确,构建环境是否干净,是否有旧的Qt构建残留导致问题,以及权限问题等。 可能用户没有从源码构建Qt的经验,因此需要详细说明如何下载Qt源码,运行configure命令,并执行后续的构建步骤。同时,提醒用户这个过程可能需要较长时间,并且需要安装必要的依赖库。 另外,如果用户不需要修改Qt的配置,是否有其他方法绕过这个问题?例如,使用软件渲染或其他渲染后端,但某些示例可能硬性依赖OpenGL功能,无法绕过。 最后,需要验证这些步骤的正确性,确保给出的建议适用于大多数情况,特别是用户可能使用的不同操作系统和Qt版本。</think>当遇到Qt示例提示`this example requires qt to be configured with -opengl desktop`时,通常是因为当前Qt库未启用桌面版OpenGL支持。以下是详细解决方法: --- ### **问题原因** 1. **Qt的OpenGL后端配置不匹配** 部分Qt图形示例(如OpenGL相关示例)依赖**桌面版OpenGL**(Desktop OpenGL),而非嵌入式版本(OpenGL ES)。 2. **Qt构建时未启用桌面OpenGL** 若Qt在编译时未通过`-opengl desktop`配置,可能导致相关功能缺失。 --- ### **解决方法** #### **步骤1:确认Qt版本与系统环境** - **Qt版本**:低于5.5的版本需显式配置`-opengl desktop`;5.5及更高版本可能需其他方式(见下文)。 - **操作系统依赖**: - **Linux**:安装OpenGL开发库(如Mesa): ```bash sudo apt-get install mesa-common-dev libgl1-mesa-dev ``` - **Windows/macOS**:确保显卡驱动支持OpenGL,并安装对应SDK(如Windows的[OpenGL SDK](https://www.opengl.org/))。 --- #### **步骤2:重新配置并编译Qt** 1. **下载Qt源码** 从[Qt官方下载页](https://download.qt.io/)获取对应版本源码。 2. **配置时启用桌面OpenGL** 在终端中运行以下命令(以Qt 5.5为例): ```bash ./configure -opengl desktop ``` - **新版本Qt(5.15+)**:改用`-qt-libpng`等参数,或确保系统OpenGL库已正确链接: ```bash ./configure -system-opengl ``` 3. **编译并安装Qt** ```bash make -j4 # 根据CPU核心数调整并行编译数(如-j8) sudo make install ``` --- #### **步骤3:验证配置** 1. **检查Qt的OpenGL支持** 运行Qt示例前,通过以下代码片段验证OpenGL类型: ```cpp #include <QOpenGLContext> QOpenGLContext ctx; ctx.create(); qDebug() << "OpenGL Type:" << ctx.isOpenGLES() ? "OpenGL ES" : "Desktop OpenGL"; ``` 2. **重新编译示例** 清理旧构建并重新编译: ```bash make clean && qmake && make ``` --- ### **常见问题** 1. **错误:`Could not create OpenGL context`** - 系统缺少OpenGL驱动,更新显卡驱动或安装`mesa-utils`(Linux)。 - 虚拟机用户需启用3D加速(如VirtualBox中勾选“启用3D加速”)。 2. **Qt预编译包问题** 某些预编译Qt包(如Linux发行版仓库中的版本)可能默认禁用OpenGL桌面支持。建议从源码编译。 --- ### **替代方案** 若无法重新编译Qt,可尝试: 1. **强制使用软件渲染**(仅限部分场景): ```bash export QT_XCB_FORCE_SOFTWARE_OPENGL=1 ``` 2. **修改示例代码**:将`QSurfaceFormat::setRenderableType(QSurfaceFormat::OpenGL)`替换为兼容类型(需熟悉Qt图形模块)。 --- 通过以上步骤,您应能解决因OpenGL配置导致的Qt示例运行问题。如仍报错,请检查系统日志或Qt的编译日志以获取详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值