Qt图标示例

图标示例展示了如何生成反映图标状态、模式和大小的像素图。

这些像素图是从图标可用的像素图集生成的,Qt小部件使用它来显示代表特定操作的图标。

内容:

QIcon概述

该类提供不同模式和状态下的可缩放图标。图标的状态和模式取决于图标的预期用途。Qt目前定义了四种模式:

模式 描述
QIcon::Normal 当用户不与图标交互,但图标表示的功能可用时,显示像素图。
QIcon::Active 当图标所表示的功能可用且用户正在与图标交互(例如,将鼠标移到图标上或单击图标)时,显示 pixmap。
QIcon::Disabled 当图标表示的功能不可用时显示像素图。
QIcon::Selected 选择图标时显示像素图。

的状态是 和 ,当控件处于相应状态时,将显示 pixmap。最常见的用法是显示可检查的工具按钮或菜单项(请参见 () 和 ())。选中工具按钮或菜单项时,状态为 ,否则为 。例如,您可以使用 的状态来显示不同的像素图,具体取决于是否选中了工具按钮或菜单项。

A 可以从给定的像素图集中生成更小、更大、活动、禁用和选定的像素图。Qt小部件使用这种像素图来显示代表特定操作的图标。

图标应用程序概述

使用图标应用程序,您可以预览图标生成的像素图,反映其不同的状态,模式和大小。

将图像加载到应用程序中时,它将转换为像素图,并成为图标可用的像素图集的一部分。可以通过选中相关复选框从此集中排除图像。该应用程序提供了一个子目录,其中包含明确设计的图像集,以说明Qt如何在不同的模式和状态下呈现图标。

该应用程序允许您使用一些预定义的大小和数字调整框来操作图标大小。预定义的大小取决于样式,但大多数样式具有相同的值。只有 macOS 样式的不同之处在于工具栏按钮使用 32 像素而不是 16 像素。您可以使用菜单在可用样式之间导航。

该菜单还提供了使应用程序根据图像的文件名猜测图标状态和模式的选项。该菜单提供了添加图像和删除所有图像的选项。这些最后选项也可以通过上下文菜单获得,如果您在图像文件表中按鼠标右键,则会出现该菜单。此外,菜单提供了一个选项,菜单提供有关示例和Qt的信息。

上面的屏幕截图显示了加载了一个图像文件的应用程序。已启用,样式为塑性。

当仅提供一个可用的像素图时,该像素图用于所有状态和模式。在这种情况下,像素图的图标模式设置为正常,并且为正常和活动模式生成的像素图将看起来相同。但在禁用和选择模式下,Qt将生成略有不同的像素图。

下一个屏幕截图显示了加载了附加文件的应用程序,该文件提供了两个可用的像素图。请注意,新图像文件的模式设置为禁用。渲染模式像素图时,Qt现在将使用新图像。我们可以看到差异:第一个屏幕截图中生成的禁用像素图比第二个屏幕截图中最初设置禁用模式的像素图略暗。

当Qt渲染图标的像素图时,它会按照特定算法搜索一组可用的像素图。该算法记录在 中,但我们将在下面描述一些特定情况。

在上面的屏幕截图中,我们已设置为活动/打开像素图和正常/关闭。若要呈现其他六种模式/状态组合,请使用下表中所述的搜索算法:monkey_on_32x32monkey_off_64x64

请求的像素图 首选替代方案(模式/状态)
模式 1 2 3 4 5 6 7 8
正常 关闭 N0 答0 N1 答1 D0 S0 D1 S1
N1 答1 N0 答0 D1 S1 D0 S0
积极 关闭 答0 N0 答1 N1 D0 S0 D1 S1
答1 N1 答0 N0 D1 S1 D0 S0
禁用 关闭 D0 N0' A0' D1 N1' A1' S0' S1'
D1 N1' A1' D0 N0' A0' S1' S0'
选择 关闭 S0 N0'' A0'' S1 N1'' A1'' D0'' D1''
S1 N1'' A1'' S0 N0'' A0'' D1'' D0''

在表中,“0”和“1”分别代表“关闭”和“打开”。单引号表示生成 pixmap 的禁用(“灰显”)版本;类似地,双 Quuote 表示生成像素映射的选定(“蓝出”)版本。

上面屏幕截图中使用的替代方案以粗体显示。例如,禁用/关闭像素图是通过灰显正常/关闭像素映射 () 派生的。monkey_off_64x64

在接下来的屏幕截图中,我们加载了整组猴子图像。通过选中或取消选中图像列表中的文件名,我们得到不同的结果:

猴子文件的屏幕截图

猴子文件的屏幕截图

对于任何给定的模式/状态组合,可以指定不同分辨率的多个图像。渲染图标时,将自动选择最合适的图像,并在必要时将其缩小。(从不放大图像,因为这很少看起来不错。

下面的屏幕截图显示了当我们提供三个图像(、、)并尝试以各种分辨率渲染时会发生什么:qt_extended_16x16.pngqt_extended_32x32.pngqt_extended_48x48.png

Qt 扩展图标在 8 x 8

Qt 扩展图标在 16 x 16

Qt 扩展图标在 17 x 17
8 x 8 16 x 16 17 x 17

Qt 扩展图标在 32 x 32

Qt 扩展图标在 33 x 33

Qt 扩展图标在 48 x 48

Qt 扩展图标在 64 x 64
32 x 32 33 x 33 48 x 48 64 x 64

对于最大为 16 x 16 的尺寸,如有必要,请使用并缩小它。对于 17 x 17 和 32 x 32 之间的尺寸,它使用 .对于 32 x 32 以上的尺寸,它使用 .qt_extended_16x16.pngqt_extended_32x32.pngqt_extended_48x48.png

逐行演练

图标示例由四个类组成:

  • MainWindow继承并且是主应用程序窗口。
  • IconPreviewArea是一个自定义小部件,显示给定图标的所有状态和模式组合。
  • IconSizeSpinBox是允许用户输入图标大小(例如,“48 x 48”)的子类。
  • ImageDelegate是 的一个子类,它提供了组合框,用于让用户设置与图像关联的模式和状态。

我们将先复习课程,然后再查看课程。最后,我们将回顾 和 类。IconPreviewAreaMainWindowIconSizeSpinBoxImageDelegate

图标预览区域类定义

微件由一个分组框组成,该分组框包含显示标题和像素图的小部件网格。IconPreviewArea

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">class</span> <span style="color:#4f9d08">IconPreviewArea</span> <span style="color:#ffffff">:</span> <span style="color:#ffff55">public</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qwidget.html" href="https://doc.qt.io/qt-6/qwidget.html"><span style="color:#21be2b">QWidget</span></a>
<span style="color:#ffffff">{</span><span style="color:#ffffff">
    Q_OBJECT

</span><span style="color:#ffff55">public</span><span style="color:#ffffff">:</span>
    <span style="color:#ffff55">explicit</span> <span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qwidget.html" href="https://doc.qt.io/qt-6/qwidget.html"><span style="color:#21be2b">QWidget</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">parent </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">nullptr</span><span style="color:#ffffff">);</span>

    <span style="color:#ffff55">void</span><span style="color:#ffffff"> setIcon</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">icon</span><span style="color:#ffffff">);</span>
    <span style="color:#ffff55">void</span><span style="color:#ffffff"> setSize</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qsize.html" href="https://doc.qt.io/qt-6/qsize.html"><span style="color:#21be2b">QSize</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">size</span><span style="color:#ffffff">);</span>

    <span style="color:#ffff55">static</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Mode</span><span style="color:#ffffff">></span><span style="color:#ffffff"> iconModes</span><span style="color:#ffffff">();</span>
    <span style="color:#ffff55">static</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">State</span><span style="color:#ffffff">></span><span style="color:#ffffff"> iconStates</span><span style="color:#ffffff">();</span>
    <span style="color:#ffff55">static</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qstringlist.html" href="https://doc.qt.io/qt-6/qstringlist.html"><span style="color:#21be2b">QStringList</span></a><span style="color:#ffffff"> iconModeNames</span><span style="color:#ffffff">();</span>
    <span style="color:#ffff55">static</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qstringlist.html" href="https://doc.qt.io/qt-6/qstringlist.html"><span style="color:#21be2b">QStringList</span></a><span style="color:#ffffff"> iconStateNames</span><span style="color:#ffffff">();</span>

<span style="color:#ffff55">private</span><span style="color:#ffffff">:</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">createHeaderLabel</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qstring.html" href="https://doc.qt.io/qt-6/qstring.html"><span style="color:#21be2b">QString</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">text</span><span style="color:#ffffff">);</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">createPixmapLabel</span><span style="color:#ffffff">();</span>
    <span style="color:#ffff55">void</span><span style="color:#ffffff"> updatePixmapLabels</span><span style="color:#ffffff">();</span>

    <span style="color:#ffff55">enum</span> <span style="color:#ffffff">{</span> <span style="color:#4f9d08">NumModes</span> <span style="color:#ffffff">=</span> <span style="color:#ff55ff">4</span><span style="color:#ffffff">,</span> <span style="color:#4f9d08">NumStates</span> <span style="color:#ffffff">=</span> <span style="color:#ff55ff">2</span> <span style="color:#ffffff">};</span>

    <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff"> icon</span><span style="color:#ffffff">;</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qsize.html" href="https://doc.qt.io/qt-6/qsize.html"><span style="color:#21be2b">QSize</span></a><span style="color:#ffffff"> size</span><span style="color:#ffffff">;</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">stateLabels</span><span style="color:#ffffff">[</span><span style="color:#4f9d08">NumStates</span><span style="color:#ffffff">]</span><span style="color:#ffffff">;</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">modeLabels</span><span style="color:#ffffff">[</span><span style="color:#4f9d08">NumModes</span><span style="color:#ffffff">]</span><span style="color:#ffffff">;</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">pixmapLabels</span><span style="color:#ffffff">[</span><span style="color:#4f9d08">NumModes</span><span style="color:#ffffff">]</span><span style="color:#ffffff">[</span><span style="color:#4f9d08">NumStates</span><span style="color:#ffffff">]</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">};</span></span></span></span>

该类继承 .它以给定大小显示与图标的可能状态和模式相对应的生成的像素图。IconPreviewArea

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Mode</span><span style="color:#ffffff">></span> <span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">iconModes</span><span style="color:#ffffff">()</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">static</span> <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Mode</span><span style="color:#ffffff">></span><span style="color:#ffffff"> result </span><span style="color:#ffffff">=</span> <span style="color:#ffffff">{</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Normal</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Active</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Disabled</span><span style="color:#ffffff">,</span>
                                               <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Selected</span> <span style="color:#ffffff">};</span>
    <span style="color:#ffff55">return</span><span style="color:#ffffff"> result</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">}</span>

<a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">State</span><span style="color:#ffffff">></span> <span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">iconStates</span><span style="color:#ffffff">()</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">static</span> <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qlist.html" href="https://doc.qt.io/qt-6/qlist.html"><span style="color:#21be2b">QList</span></a><span style="color:#ffffff"><</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">State</span><span style="color:#ffffff">></span><span style="color:#ffffff"> result </span><span style="color:#ffffff">=</span> <span style="color:#ffffff">{</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Off</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">On</span> <span style="color:#ffffff">};</span>
    <span style="color:#ffff55">return</span><span style="color:#ffffff"> result</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">}</span>

<a data-cke-saved-href="https://doc.qt.io/qt-6/qstringlist.html" href="https://doc.qt.io/qt-6/qstringlist.html"><span style="color:#21be2b">QStringList</span></a> <span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">iconModeNames</span><span style="color:#ffffff">()</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">static</span> <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qstringlist.html" href="https://doc.qt.io/qt-6/qstringlist.html"><span style="color:#21be2b">QStringList</span></a><span style="color:#ffffff"> result </span><span style="color:#ffffff">=</span> <span style="color:#ffffff">{</span><span style="color:#ffffff">tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"Normal"</span><span style="color:#ffffff">)</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"Active"</span><span style="color:#ffffff">)</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"Disabled"</span><span style="color:#ffffff">)</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"Selected"</span><span style="color:#ffffff">)};</span>
    <span style="color:#ffff55">return</span><span style="color:#ffffff"> result</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">}</span>

<a data-cke-saved-href="https://doc.qt.io/qt-6/qstringlist.html" href="https://doc.qt.io/qt-6/qstringlist.html"><span style="color:#21be2b">QStringList</span></a> <span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">iconStateNames</span><span style="color:#ffffff">()</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">static</span> <span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qstringlist.html" href="https://doc.qt.io/qt-6/qstringlist.html"><span style="color:#21be2b">QStringList</span></a><span style="color:#ffffff"> result </span><span style="color:#ffffff">=</span> <span style="color:#ffffff">{</span><span style="color:#ffffff">tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"Off"</span><span style="color:#ffffff">)</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"On"</span><span style="color:#ffffff">)};</span>
    <span style="color:#ffff55">return</span><span style="color:#ffffff"> result</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">}</span></span></span></span>

我们希望表列的顺序是 、 、 和行的顺序 ,这与枚举不匹配。上面的代码提供了允许从枚举值映射到行/列(通过使用 ())并使用数组索引和匹配字符串列表映射回来的数组。Qt的容器可以通过使用C++11个初始值设定项列表轻松填充。

我们需要两个公共函数来设置当前图标和图标的大小。此外,该类还有三个私有函数: 我们在构造预览区域时使用 and 函数,并且当图标或图标的大小发生变化时,我们需要函数来更新预览区域。createHeaderLabel()createPixmapLabel()updatePixmapLabels()

和常量反映 当前定义的模式和状态的数量。NumModesNumStates

图标预览区域类实现

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qwidget.html" href="https://doc.qt.io/qt-6/qwidget.html"><span style="color:#21be2b">QWidget</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">)</span>
    <span style="color:#ffffff">:</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qwidget.html" href="https://doc.qt.io/qt-6/qwidget.html"><span style="color:#21be2b">QWidget</span></a><span style="color:#ffffff">(</span><span style="color:#ffffff">parent</span><span style="color:#ffffff">)</span>
<span style="color:#ffffff">{</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qgridlayout.html" href="https://doc.qt.io/qt-6/qgridlayout.html"><span style="color:#21be2b">QGridLayout</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">mainLayout </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">new</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qgridlayout.html" href="https://doc.qt.io/qt-6/qgridlayout.html"><span style="color:#21be2b">QGridLayout</span></a><span style="color:#ffffff">(</span><span style="color:#ffff55">this</span><span style="color:#ffffff">);</span>

    <span style="color:#ffff55">for</span> <span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> row </span><span style="color:#ffffff">=</span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">;</span><span style="color:#ffffff"> row </span><span style="color:#ffffff"><</span> <span style="color:#4f9d08">NumStates</span><span style="color:#ffffff">;</span> <span style="color:#ffffff">+</span><span style="color:#ffffff">+</span><span style="color:#ffffff">row</span><span style="color:#ffffff">)</span> <span style="color:#ffffff">{</span><span style="color:#ffffff">
        stateLabels</span><span style="color:#ffffff">[</span><span style="color:#ffffff">row</span><span style="color:#ffffff">]</span> <span style="color:#ffffff">=</span><span style="color:#ffffff"> createHeaderLabel</span><span style="color:#ffffff">(</span><span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">iconStateNames</span><span style="color:#ffffff">()</span><span style="color:#ffffff">.</span><span style="color:#ffffff">at</span><span style="color:#ffffff">(</span><span style="color:#ffffff">row</span><span style="color:#ffffff">));</span><span style="color:#ffffff">
        mainLayout</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">addWidget</span><span style="color:#ffffff">(</span><span style="color:#ffffff">stateLabels</span><span style="color:#ffffff">[</span><span style="color:#ffffff">row</span><span style="color:#ffffff">]</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> row </span><span style="color:#ffffff">+</span> <span style="color:#ff55ff">1</span><span style="color:#ffffff">,</span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">);</span>
    <span style="color:#ffffff">}</span><span style="color:#ffffff">
    Q_ASSERT</span><span style="color:#ffffff">(</span><span style="color:#4f9d08">NumStates</span> <span style="color:#ffffff">=</span><span style="color:#ffffff">=</span> <span style="color:#ff55ff">2</span><span style="color:#ffffff">);</span>

    <span style="color:#ffff55">for</span> <span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> column </span><span style="color:#ffffff">=</span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">;</span><span style="color:#ffffff"> column </span><span style="color:#ffffff"><</span> <span style="color:#4f9d08">NumModes</span><span style="color:#ffffff">;</span> <span style="color:#ffffff">+</span><span style="color:#ffffff">+</span><span style="color:#ffffff">column</span><span style="color:#ffffff">)</span> <span style="color:#ffffff">{</span><span style="color:#ffffff">
        modeLabels</span><span style="color:#ffffff">[</span><span style="color:#ffffff">column</span><span style="color:#ffffff">]</span> <span style="color:#ffffff">=</span><span style="color:#ffffff"> createHeaderLabel</span><span style="color:#ffffff">(</span><span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">iconModeNames</span><span style="color:#ffffff">()</span><span style="color:#ffffff">.</span><span style="color:#ffffff">at</span><span style="color:#ffffff">(</span><span style="color:#ffffff">column</span><span style="color:#ffffff">));</span><span style="color:#ffffff">
        mainLayout</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">addWidget</span><span style="color:#ffffff">(</span><span style="color:#ffffff">modeLabels</span><span style="color:#ffffff">[</span><span style="color:#ffffff">column</span><span style="color:#ffffff">]</span><span style="color:#ffffff">,</span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> column </span><span style="color:#ffffff">+</span> <span style="color:#ff55ff">1</span><span style="color:#ffffff">);</span>
    <span style="color:#ffffff">}</span><span style="color:#ffffff">
    Q_ASSERT</span><span style="color:#ffffff">(</span><span style="color:#4f9d08">NumModes</span> <span style="color:#ffffff">=</span><span style="color:#ffffff">=</span> <span style="color:#ff55ff">4</span><span style="color:#ffffff">);</span>

    <span style="color:#ffff55">for</span> <span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> column </span><span style="color:#ffffff">=</span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">;</span><span style="color:#ffffff"> column </span><span style="color:#ffffff"><</span> <span style="color:#4f9d08">NumModes</span><span style="color:#ffffff">;</span> <span style="color:#ffffff">+</span><span style="color:#ffffff">+</span><span style="color:#ffffff">column</span><span style="color:#ffffff">)</span> <span style="color:#ffffff">{</span>
        <span style="color:#ffff55">for</span> <span style="color:#ffffff">(</span><span style="color:#ffff55">int</span><span style="color:#ffffff"> row </span><span style="color:#ffffff">=</span> <span style="color:#ff55ff">0</span><span style="color:#ffffff">;</span><span style="color:#ffffff"> row </span><span style="color:#ffffff"><</span> <span style="color:#4f9d08">NumStates</span><span style="color:#ffffff">;</span> <span style="color:#ffffff">+</span><span style="color:#ffffff">+</span><span style="color:#ffffff">row</span><span style="color:#ffffff">)</span> <span style="color:#ffffff">{</span><span style="color:#ffffff">
            pixmapLabels</span><span style="color:#ffffff">[</span><span style="color:#ffffff">column</span><span style="color:#ffffff">]</span><span style="color:#ffffff">[</span><span style="color:#ffffff">row</span><span style="color:#ffffff">]</span> <span style="color:#ffffff">=</span><span style="color:#ffffff"> createPixmapLabel</span><span style="color:#ffffff">();</span><span style="color:#ffffff">
            mainLayout</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">addWidget</span><span style="color:#ffffff">(</span><span style="color:#ffffff">pixmapLabels</span><span style="color:#ffffff">[</span><span style="color:#ffffff">column</span><span style="color:#ffffff">]</span><span style="color:#ffffff">[</span><span style="color:#ffffff">row</span><span style="color:#ffffff">]</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> row </span><span style="color:#ffffff">+</span> <span style="color:#ff55ff">1</span><span style="color:#ffffff">,</span><span style="color:#ffffff"> column </span><span style="color:#ffffff">+</span> <span style="color:#ff55ff">1</span><span style="color:#ffffff">);</span>
        <span style="color:#ffffff">}</span>
    <span style="color:#ffffff">}</span>
<span style="color:#ffffff">}</span></span></span></span>

在构造函数中,我们创建显示标题和图标生成的像素图的标签,并将它们添加到网格布局中。

创建标头标签时,我们确保文件中定义的枚举和与我们创建的标签数量相对应。然后,如果在某个时候更改了枚举,宏将提醒文件的这一部分也需要更新。NumModesNumStates.hQ_ASSERT().cpp

如果应用程序是在调试模式下构建的,则宏将扩展到Q_ASSERT()

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">!</span><span style="color:#ffffff">condition</span><span style="color:#ffffff">)</span>
   <a data-cke-saved-href="https://doc.qt.io/qt-6/qtlogging.html#qFatal" href="https://doc.qt.io/qt-6/qtlogging.html#qFatal"><span style="color:#ffffff">qFatal</span></a><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"ASSERT: "</span><span style="color:#ffffff">condition</span><span style="color:#aaaaaa">" in file ..."</span><span style="color:#ffffff">);</span></span></span></span>

在释放模式下,宏会消失。可以在应用程序的文件中设置模式。一种方法是在构建应用程序时添加一个选项:.proqmake

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffffff">qmake </span><span style="color:#aaaaaa">"CONFIG += debug"</span><span style="color:#ffffff"> icons</span><span style="color:#ffffff">.</span><span style="color:#ffffff">pro</span></span></span></span>

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffffff">qmake </span><span style="color:#aaaaaa">"CONFIG += release"</span><span style="color:#ffffff"> icons</span><span style="color:#ffffff">.</span><span style="color:#ffffff">pro</span></span></span></span>

另一种方法是将此行直接添加到文件中。.pro

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><span style="color:#ffff55">void</span> <span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">setIcon</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qicon.html" href="https://doc.qt.io/qt-6/qicon.html"><span style="color:#21be2b">QIcon</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">icon</span><span style="color:#ffffff">)</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">this</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">icon </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> icon</span><span style="color:#ffffff">;</span><span style="color:#ffffff">
    updatePixmapLabels</span><span style="color:#ffffff">();</span>
<span style="color:#ffffff">}</span>

<span style="color:#ffff55">void</span> <span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">setSize</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qsize.html" href="https://doc.qt.io/qt-6/qsize.html"><span style="color:#21be2b">QSize</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">size</span><span style="color:#ffffff">)</span>
<span style="color:#ffffff">{</span>
    <span style="color:#ffff55">if</span> <span style="color:#ffffff">(</span><span style="color:#ffffff">size </span><span style="color:#ffffff">!</span><span style="color:#ffffff">=</span> <span style="color:#ffff55">this</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">size</span><span style="color:#ffffff">)</span> <span style="color:#ffffff">{</span>
        <span style="color:#ffff55">this</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">size </span><span style="color:#ffffff">=</span><span style="color:#ffffff"> size</span><span style="color:#ffffff">;</span><span style="color:#ffffff">
        updatePixmapLabels</span><span style="color:#ffffff">();</span>
    <span style="color:#ffffff">}</span>
<span style="color:#ffffff">}</span></span></span></span>

公共和函数更改图标或图标大小,并确保生成的像素图已更新。setIcon()setSize()

<span style="color:#404244"><span style="background-color:#3a4055"><span style="color:#ffffff"><a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">createHeaderLabel</span><span style="color:#ffffff">(</span><span style="color:#ffff55">const</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qstring.html" href="https://doc.qt.io/qt-6/qstring.html"><span style="color:#21be2b">QString</span></a> <span style="color:#ffffff">&</span><span style="color:#ffffff">text</span><span style="color:#ffffff">)</span>
<span style="color:#ffffff">{</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">label </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">new</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a><span style="color:#ffffff">(</span><span style="color:#ffffff">tr</span><span style="color:#ffffff">(</span><span style="color:#aaaaaa">"<b>%1</b>"</span><span style="color:#ffffff">)</span><span style="color:#ffffff">.</span><span style="color:#ffffff">arg</span><span style="color:#ffffff">(</span><span style="color:#ffffff">text</span><span style="color:#ffffff">));</span><span style="color:#ffffff">
    label</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">setAlignment</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">AlignCenter</span><span style="color:#ffffff">);</span>
    <span style="color:#ffff55">return</span><span style="color:#ffffff"> label</span><span style="color:#ffffff">;</span>
<span style="color:#ffffff">}</span>

<a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#4f9d08">IconPreviewArea</span><span style="color:#ffffff">::</span><span style="color:#ffffff">createPixmapLabel</span><span style="color:#ffffff">()</span>
<span style="color:#ffffff">{</span>
    <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a> <span style="color:#ffffff">*</span><span style="color:#ffffff">label </span><span style="color:#ffffff">=</span> <span style="color:#ffff55">new</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qlabel.html" href="https://doc.qt.io/qt-6/qlabel.html"><span style="color:#21be2b">QLabel</span></a><span style="color:#ffffff">;</span><span style="color:#ffffff">
    label</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">setEnabled</span><span style="color:#ffffff">(</span><span style="color:#ffff55">false</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
    label</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">setAlignment</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qt.html" href="https://doc.qt.io/qt-6/qt.html"><span style="color:#21be2b">Qt</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">AlignCenter</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
    label</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">setFrameShape</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qframe.html" href="https://doc.qt.io/qt-6/qframe.html"><span style="color:#21be2b">QFrame</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Box</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
    label</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">setSizePolicy</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qsizepolicy.html" href="https://doc.qt.io/qt-6/qsizepolicy.html"><span style="color:#21be2b">QSizePolicy</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Expanding</span><span style="color:#ffffff">,</span> <a data-cke-saved-href="https://doc.qt.io/qt-6/qsizepolicy.html" href="https://doc.qt.io/qt-6/qsizepolicy.html"><span style="color:#21be2b">QSizePolicy</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Expanding</span><span style="color:#ffffff">);</span><span style="color:#ffffff">
    label</span><span style="color:#ffffff">-</span><span style="color:#ffffff">></span><span style="color:#ffffff">setBackgroundRole</span><span style="color:#ffffff">(</span><a data-cke-saved-href="https://doc.qt.io/qt-6/qpalette.html" href="https://doc.qt.io/qt-6/qpalette.html"><span style="color:#21be2b">QPalette</span></a><span style="color:#ffffff">::</span><span style="color:#4f9d08">Base</span><span style="color:#ffffff">);</span><span style="color:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亭台六七座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值