Open main menu
首页
专栏
课程
分类
归档
Chat
Sci-Hub
谷歌学术
Libgen
GitHub镜像
登录/注册
搜索
关闭
Previous
Previous
Next
Next
Qt常用的按钮控件编程(三)-- QRadioButton 按钮
sockstack
/
241
/
2024-02-27 00:02:38
<p><span style="color: red; font-size: 18px">ChatGPT 可用网址,仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友。</span><br><a href="https://ckai.xyz/?sockstack§ion=detail" target="__blank">https://ckai.xyz</a><br><br></p> <article class="baidu_pl"><div id="article_content" class="article_content clearfix"> <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css"> <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-25cebea3f9.css"> <div id="content_views" class="markdown_views prism-atom-one-dark"> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><p></p> <div class="toc"> <h3>文章目录</h3> <ul> <li>前言</li> <li>5、QRadioButton 按钮</li> <li> <ul> <li>5.1 例程功能和程序执行效果</li> <li> <ul> <li>5.1.1 例程功能</li> <li>5.1.2 程序执行效果</li> </ul> </li> <li>5.2 生成项目</li> <li>5.3 添加资源文件</li> <li> <ul> <li>5.3.1 添加图片资源</li> <li>5.3.2 添加 qss 文件</li> </ul> </li> <li>5.4 完成代码编辑</li> <li> <ul> <li>5.4.1 修改项目文件 _radiobutton.pro</li> <li>5.4.2 修改 `main.cpp`</li> <li>5.4.3 修改 `widget.h`</li> <li>5.4.4 修改 `widget.cpp`</li> </ul> </li> <li>5.5 切换Kit,获得运行在不同系统中的运行的执行文件</li> <li>5.6 程序中的qt机制</li> <li> <ul> <li>5.6.1 资源(Resource)</li> <li> <ul> <li>5.6.1.1 qss 样式表文件</li> <li>5.6.1.2 图片文件</li> </ul> </li> <li>5.6.2 按钮组 QButtonGroup</li> </ul> </li> </ul> </li> <li>总结</li> </ul> </div> <p></p> <hr> <h1> <a id="_5"></a>前言</h1> <p>本文介绍QT常用控件的第三个按钮,QRadioButton 单选按钮编程。通过这个例子,初步了解QT管理资源机制,以及如何分组管理QRadioButton 单选按钮。项目演示如何使用默认的分组和 QButtonGroup 进行互斥设置,保证多个选项所在的组内只有一个被选中。项目使用样式表文件将两组按钮使用不同的样式表进行外观设置。<br> 文章中使用的例程和内容都是在chatgpt的帮助下完成的,例程经过测试通过。<br> 我们的调试环境仍然是双架构<code>Kits</code>,编译调试在当前的ubuntu(qt5)中进行,重新编译后下载到目标arm设备(qt4)中运行。<br> 我们的编程环境为:Ubuntu64位系统(22.04),目标架构:(1)<code>qt5 x86_64</code> 架构,(2)<code>qt4 32位arm</code>架构。<br> 环境配置请参见《Qt常用的按钮控件编程(一)》第1节。</p> <blockquote> <p>感谢朋友提供的chatgpt软件,特别是其中的gpt-box桌面工具,更是我离不开的工具。感兴趣的同仁可前往一观(apsuai.com)。</p> </blockquote> <h1> <a id="5QRadioButton__15"></a>5、QRadioButton 按钮</h1> <p>QRadioButton 是 Qt 中的一个控件类,表示一个单选按钮。在一组单选按钮中,只有一个可以被选中。通常配合 QButtonGroup 使用来实现分组单选功能。</p> <h2> <a id="51__18"></a>5.1 例程功能和程序执行效果</h2> <h3> <a id="511__19"></a>5.1.1 例程功能</h3> <p>该例程利用 QRadioButton 控件实现了多选项的单选,让用户方便地进行选择。通过默认的分组和 QButtonGroup 进行互斥设置,保证多个选项所在的组内只有一个被选中,从而达到符合用户交互习惯的效果。例程中涉及到了 单选按钮(QRadioButton) 和 按钮组(QButtonGroup )控件的使用。<br> 在该例程中,5 个 单选控件分为 2 组,分别为第一组的 2 个单选控件和第二组的 3 个 单选控件。我们的程序将 5 个控件添加到主窗口中。<br> 对于第一组的 2 个 单选控件,使用 Qt 默认的分组功能,即将这两个控件放在主窗口中,因为 QRadioButton 是继承自 QAbstractButton 的,所以它的自动互斥特性会自动生效,即任何一组中多个 QRadioButton 控件只能有一个被选中。<br> 对于第二组的 3 个 单选控件,使用 按钮组(QButtonGroup )来实现互斥。这里我们新建一个 QButtonGroup 控件,将其加入到主窗口中,然后将窗口中的 3 个单选控件分别添加到该 QButtonGroup 中。这样,当选中其中某个单选控件时,其他组内的单选控件会自动取消选择。可以通过 setChecked() 函数设置初始选中状态,程序启动后,用户可以通过鼠标或触摸选择其他单选控件。</p> <h3> <a id="512__24"></a>5.1.2 程序执行效果</h3> <p><img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/48d4546895634ee1862ae6d0c2f6c00b.png" alt="在这里插入图片描述">其中<code>开关一</code>和<code>开关二</code>为第一组,<code>选择一</code>、<code>选择二</code>、<code>选择三</code>第二组。</p> <h2> <a id="52__27"></a>5.2 生成项目</h2> <p>打开 Qt Creator 并创建一个新的 应用程序项目_radiobutton,选择了Widget基类,不要勾选“Generate form”,将两个配置好的Kits同时选上,项目新建完成如下图。(详细的项目新建过程参见:《Qt常用的按钮控件编程(一)》)<br> <img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/1f2b77255b664067bd044a67827876a0.png" alt="在这里插入图片描述"></p> <h2> <a id="53__30"></a>5.3 添加资源文件</h2> <p>在 Qt 中,可以使用资源文件(.qrc 文件)将一些静态资源(如图像、音频等)打包到应用程序中,以方便统一管理和部署。在本例程中,在images 文件夹中准备了4张图片,拷贝到本项目路径中,下图演示了如何将资源添加到项目中。</p> <h3> <a id="531__34"></a>5.3.1 添加图片资源</h3> <ul><li>在项目目录中右键点击 Resources 目录,选择 Add New… ,并选择 Qt -> Qt Resource File。<br> <img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/5ec61d6fd7294eec9e5d45e7f80969f6.png" alt="在这里插入图片描述"><br> 在打开的对话框中输入名称(最好与文件名一致),然后点击 Next。</li></ul> <p><img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/2ff2b12ec010450d9ae4c0e63665814e.png" alt="在这里插入图片描述">输入资源文件的名称(自行定义)和位置,然后点击“下一步”。<br> <img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/f2e04a85cb3041f18fe9eca8c0e6e0bc.png" alt="在这里插入图片描述"></p> <p>在 Qt Creator 中新建资源文件后,默认会进入 res.qrc 文件编辑模式(如果关闭了,可以右键这个文<br> 件点击选择“Open in Editor”),为了方便分类管理文件,我们可以使用 Add Prefix 功能为资源文件添加前缀,前缀的格式应该为类似文件系统中的路径格式,例如 /images。<br> <img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/c817f1f9f2e94f12a5dd370d76e876e2.png" alt="在这里插入图片描述">为了确保路径正确,前缀中的 / 是必需的,它在资源文件引用时是路径分隔符,起到类似 Linux 下根节点的作用,我们现在第⑪处添加了前缀/。<br> <img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/567bfc0df7c245f7841326c4f2e270ca.png" alt="在这里插入图片描述"><br> 添加了前缀后,我们添加资源图片,放在/images 前缀的下面。这里我们导入在本项目路径 images 文件夹中的4张图片,添加完成需要按“Ctrl + S”保存 res.qrc 才会看到左边的结果。添加完成如下图。<br> <img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/7a0201bbfa3341519a0c0ecfcd2123fb.png" alt="在这里插入图片描述"></p> <h3> <a id="532__qss__49"></a>5.3.2 添加 qss 文件</h3> <p>QSS 文件是使用 Qt 程序相关联的样式表文件。它由 GUI 元素的外观和感觉,包括布局,颜色,鼠标的行为,大小和字体。它的风格,一个可以合并到一个 UI(用户界面)。与 HTML 的 CSS 类似,Qt 的样式表是纯文本的格式定义,在应用程序运行时可以载入和解析这些样式定义,从而使应用程序的界面呈现不同的效果。<br> <img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/c05203f7059649f8b348d18a2c2d3fe1.png" alt="在这里插入图片描述">如上图加入一个空白文件,新建的文件名 style.qss 文件,如下图,默认添加到项目的路径下,后面步骤采用默认,直至完成。<br> <img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/a1008df790ed4e2fb0b53d794494f02f.png" alt="在这里插入图片描述">编辑style.qss,保存,最后完成的项目如下图所示:</p> <p><img referrerpolicy="no-referrer" src="https://img-blog.csdnimg.cn/47fa4fad1f97452b9b6e5fc8004dbe96.png" alt="在这里插入图片描述">style.qss文件内容:</p> <pre><code class="prism language-perl"><span class="token regex">/* 第一组 QRadioButton 设置 */</span> QRadioButton<span class="token comment">#radiogroup1{<!-- --></span>spacing<span class="token punctuation">:</span> 2px<span class="token punctuation">;</span>color<span class="token punctuation">:</span> red<span class="token punctuation">;</span> <span class="token punctuation">}</span> QRadioButton<span class="token comment">#radiogroup1::indicator {<!-- --></span>width<span class="token punctuation">:</span> 45px<span class="token punctuation">;</span>height<span class="token punctuation">:</span> 30px<span class="token punctuation">;</span> <span class="token punctuation">}</span> QRadioButton<span class="token comment">#radiogroup1::indicator:unchecked {<!-- --></span>image<span class="token punctuation">:</span> url<span class="token punctuation">(</span><span class="token punctuation">:</span><span class="token operator">/</span>images<span class="token operator">/</span>switch_off<span class="token operator">.</span>png<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> QRadioButton<span class="token comment">#radiogroup1::indicator:checked {<!-- --></span>image<span class="token punctuation">:</span> url<span class="token punctuation">(</span><span class="token punctuation">:</span><span class="token operator">/</span>images<span class="token operator">/</span>switch_on<span class="token operator">.</span>png<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token regex">/* 第二组 QRadiobutton 设置 */</span> QRadioButton<span class="token comment">#radiogroup2 {<!-- --></span>spacing<span class="token punctuation">:</span> 2px<span class="token punctuation">;</span>color<span class="token punctuation">:</span> blue<span class="token punctuation">;</span> <span class="token punctuation">}</span> QRadioButton<span class="token comment">#radiogroup2::indicator {<!-- --></span>width<span class="token punctuation">:</span> 45px<span class="token punctuation">;</span>height<span class="token punctuation">:</span> 30px<span class="token punctuation">;</span> <span class="token punctuation">}</span> QRadioButton<span class="token comment">#radiogroup2::indicator:unchecked {<!-- --></span>image<span class="token punctuation">:</span> url<span class="token punctuation">(</span><span class="token punctuation">:</span><span class="token operator">/</span>images<span class="token operator">/</span>radiobutton<span class="token operator">-</span>off<span class="token operator">.</span>png<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> QRadioButton<span class="token comment">#radiogroup2::indicator:checked {<!-- --></span>image<span class="token punctuation">:</span> url<span class="token punctuation">(</span><span class="token punctuation">:</span><span class="token operator">/</span>images<span class="token operator">/</span>radiobutton<span class="token operator">-</span>on<span class="token operator">.</span>png<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <h2> <a id="54___89"></a>5.4 完成代码编辑</h2> <h3> <a id="541___radiobuttonpro_90"></a>5.4.1 修改项目文件 _radiobutton.pro</h3> <pre><code class="prism language-clike"><span class="token number">1</span> QT <span class="token operator">+</span><span class="token operator">=</span> core gui <span class="token number">2</span> <span class="token number">3</span> <span class="token function">greaterThan</span><span class="token punctuation">(</span>QT_MAJOR_VERSION<span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">:</span> QT <span class="token operator">+</span><span class="token operator">=</span> widgets <span class="token number">4</span> <span class="token number">5</span> CONFIG <span class="token operator">+</span><span class="token operator">=</span> c<span class="token operator">++</span><span class="token number">11</span> <span class="token number">6</span> <span class="token number">7</span> # You can make your code fail to compile <span class="token keyword">if</span> it uses deprecated APIs<span class="token punctuation">.</span> <span class="token number">8</span> # In order to <span class="token keyword">do</span> so<span class="token punctuation">,</span> uncomment the following line<span class="token punctuation">.</span> <span class="token number">9</span> #DEFINES <span class="token operator">+</span><span class="token operator">=</span> QT_DISABLE_DEPRECATED_BEFORE<span class="token operator">=</span><span class="token number">0x060000</span> # disables all the APIs deprecated before Qt <span class="token number">6.0</span><span class="token number">.0</span> <span class="token number">10</span> <span class="token number">11</span> SOURCES <span class="token operator">+</span><span class="token operator">=</span> \ <span class="token number">12</span> main<span class="token punctuation">.</span>cpp \ <span class="token number">13</span> widget<span class="token punctuation">.</span>cpp <span class="token number">14</span> <span class="token number">15</span> HEADERS <span class="token operator">+</span><span class="token operator">=</span> \ <span class="token number">16</span> widget<span class="token punctuation">.</span>h <span class="token number">17</span> <span class="token number">18</span> # Default rules <span class="token keyword">for</span> deployment<span class="token punctuation">.</span> <span class="token number">19</span> qnx<span class="token punctuation">:</span> target<span class="token punctuation">.</span>path <span class="token operator">=</span> <span class="token operator">/</span>tmp<span class="token operator">/</span>$$<span class="token punctuation">{<!-- --></span>TARGET<span class="token punctuation">}</span><span class="token operator">/</span>bin <span class="token number">20</span> <span class="token keyword">else</span><span class="token punctuation">:</span> unix<span class="token punctuation">:</span><span class="token operator">!</span>android<span class="token punctuation">:</span> target<span class="token punctuation">.</span>path <span class="token operator">=</span> <span class="token operator">/</span>opt<span class="token operator">/</span>$$<span class="token punctuation">{<!-- --></span>TARGET<span class="token punctuation">}</span><span class="token operator">/</span>bin <span class="token number">21</span> <span class="token operator">!</span><span class="token function">isEmpty</span><span class="token punctuation">(</span>target<span class="token punctuation">.</span>path<span class="token punctuation">)</span><span class="token punctuation">:</span> INSTALLS <span class="token operator">+</span><span class="token operator">=</span> target <span class="token number">22</span> <span class="token number">23</span> RESOURCES <span class="token operator">+</span><span class="token operator">=</span> \ <span class="token number">24</span> res<span class="token punctuation">.</span>qrc <span class="token number">25</span> <span class="token number">26</span> <span class="token number">27</span> # 根据使用的 Qt 版本设置编译条件 <span class="token number">28</span> <span class="token function">greaterThan</span><span class="token punctuation">(</span>QT_MAJOR_VERSION<span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token number">29</span> # 如果使用的是 Qt <span class="token number">5</span> 或者更新版本 <span class="token number">30</span> <span class="token function">message</span><span class="token punctuation">(</span><span class="token string">"使用的是 Qt 5版本"</span><span class="token punctuation">)</span> <span class="token number">31</span> <span class="token number">32</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{<!-- --></span> <span class="token number">33</span> # 如果使用的是 Qt <span class="token number">4</span> 或者更早的版本 <span class="token number">34</span> <span class="token function">message</span><span class="token punctuation">(</span><span class="token string">"使用的是 Qt 4版本"</span><span class="token punctuation">)</span> <span class="token number">35</span> DEFINES <span class="token operator">+</span><span class="token operator">=</span> QT_ARM_PLATFORM <span class="token number">36</span> QMAKE_CXXFLAGS <span class="token operator">+</span><span class="token operator">=</span> <span class="token operator">-</span>std<span class="token operator">=</span>c<span class="token operator">++</span><span class="token number">11</span> <span class="token number">37</span> QMAKE_CXXFLAGS <span class="token operator">+</span><span class="token operator">=</span> <span class="token operator">-</span>Wno<span class="token operator">-</span>psabi <span class="token operator">-</span>Wno<span class="token operator">-</span>deprecated<span class="token operator">-</span>declarations <span class="token number">38</span> <span class="token number">39</span> LIBS <span class="token operator">+</span><span class="token operator">=</span> <span class="token operator">-</span>lts <span class="token number">40</span> <span class="token number">41</span> <span class="token punctuation">}</span> </code></pre> <p><strong>我们在系统生成的项目文件中使用条件编译增加目标为qt4-arm时的代码:</strong></p> <h3> <a id="542__maincpp_137"></a>5.4.2 修改 <code>main.cpp</code> </h3> <pre><code class="prism language-cpp"><span class="token number">1</span> #include <span class="token string">"widget.h"</span> <span class="token number">2</span> <span class="token number">3</span> #include <span class="token operator"><</span>QApplication<span class="token operator">></span> <span class="token number">4</span> <span class="token number">5</span> #ifdef QT_ARM_PLATFORM <span class="token number">6</span> #include <span class="token operator"><</span>QTextCodec<span class="token operator">></span> <span class="token number">7</span> #endif <span class="token number">8</span> <span class="token number">9</span> <span class="token comment">/* 引入 QFile */</span> <span class="token number">10</span> #include <span class="token operator"><</span>QFile<span class="token operator">></span> <span class="token number">11</span> <span class="token number">12</span> <span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>argv<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token number">13</span> <span class="token punctuation">{<!-- --></span> <span class="token number">14</span> QApplication <span class="token function">a</span><span class="token punctuation">(</span>argc<span class="token punctuation">,</span> argv<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">15</span> <span class="token number">16</span> #ifdef QT_ARM_PLATFORM <span class="token number">17</span> <span class="token comment">//解决Qt4中文乱码</span> <span class="token number">18</span> <span class="token class-name">QTextCodec</span><span class="token double-colon punctuation">::</span><span class="token function">setCodecForTr</span><span class="token punctuation">(</span><span class="token class-name">QTextCodec</span><span class="token double-colon punctuation">::</span><span class="token function">codecForName</span><span class="token punctuation">(</span><span class="token string">"GBK"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">19</span> <span class="token class-name">QTextCodec</span><span class="token double-colon punctuation">::</span><span class="token function">setCodecForTr</span><span class="token punctuation">(</span><span class="token class-name">QTextCodec</span><span class="token double-colon punctuation">::</span><span class="token function">codecForName</span><span class="token punctuation">(</span><span class="token string">"system"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//若英文系统,则用GBK</span> <span class="token number">20</span> <span class="token class-name">QTextCodec</span><span class="token double-colon punctuation">::</span><span class="token function">setCodecForLocale</span><span class="token punctuation">(</span><span class="token class-name">QTextCodec</span><span class="token double-colon punctuation">::</span><span class="token function">codecForName</span><span class="token punctuation">(</span><span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">21</span> <span class="token class-name">QTextCodec</span><span class="token double-colon punctuation">::</span><span class="token function">setCodecForCStrings</span><span class="token punctuation">(</span><span class="token class-name">QTextCodec</span><span class="token double-colon punctuation">::</span><span class="token function">codecForName</span><span class="token punctuation">(</span><span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">22</span> #endif <span class="token number">23</span> <span class="token number">24</span> <span class="token comment">/* 指定文件 */</span> <span class="token number">25</span> QFile <span class="token function">file</span><span class="token punctuation">(</span><span class="token string">":/style.qss"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">26</span> <span class="token number">27</span> <span class="token comment">/* 判断文件是否存在 */</span> <span class="token number">28</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>file<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token number">29</span> <span class="token comment">/* 以只读的方式打开 */</span> <span class="token number">30</span> file<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>QFile<span class="token double-colon punctuation">::</span>ReadOnly<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">31</span> <span class="token comment">/* 以字符串的方式保存读出的结果 */</span> <span class="token number">32</span> QString styleSheet <span class="token operator">=</span> <span class="token function">QLatin1String</span><span class="token punctuation">(</span>file<span class="token punctuation">.</span><span class="token function">readAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">33</span> <span class="token comment">/* 设置全局样式 */</span> <span class="token number">34</span> qApp<span class="token operator">-></span><span class="token function">setStyleSheet</span><span class="token punctuation">(</span>styleSheet<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">35</span> <span class="token comment">/* 关闭文件 */</span> <span class="token number">36</span> file<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">37</span> <span class="token punctuation">}</span> <span class="token number">38</span> <span class="token number">39</span> Widget w<span class="token punctuation">;</span> <span class="token number">40</span> w<span class="token punctuation">.</span><span class="token function">show</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">41</span> <span class="token keyword">return</span> a<span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">42</span> <span class="token punctuation">}</span> </code></pre> <ul> <li> <p>为了解决当程序运行在arm架构系统时,中文显示文乱码问题,根据从.pro获得的宏QT_ARM_PLATFORM作为编译条件,判断如果系统运行在arm架构,则程序包含文本字符串转换,解决Qt4中文乱码问题。</p> </li> <li> <p>第 24 行至 37 行,读取 style.qss 的内容。并设置全局样式。</p> </li> </ul> <h3> <a id="543__widgeth_188"></a>5.4.3 修改 <code>widget.h</code> </h3> <pre><code class="prism language-cpp"><span class="token number">1</span> #ifndef WIDGET_H <span class="token number">2</span> #define WIDGET_H <span class="token number">3</span> <span class="token number">4</span> #include <span class="token operator"><</span>QWidget<span class="token operator">></span> <span class="token number">5</span> <span class="token number">6</span> <span class="token comment">/* 引入 QRadioButton */</span> <span class="token number">7</span> #include <span class="token operator"><</span>QRadioButton<span class="token operator">></span> <span class="token number">8</span> <span class="token number">9</span> <span class="token comment">/* 引入 QButtonGroup */</span> <span class="token number">10</span> #include <span class="token operator"><</span>QButtonGroup<span class="token operator">></span> <span class="token number">11</span> <span class="token keyword">class</span> <span class="token class-name">Widget</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">public</span> <span class="token class-name">QWidget</span> <span class="token number">12</span></span> <span class="token punctuation">{<!-- --></span> <span class="token number">13</span> Q_OBJECT <span class="token number">14</span> <span class="token number">15</span> <span class="token keyword">public</span><span class="token operator">:</span> <span class="token number">16</span> <span class="token function">Widget</span><span class="token punctuation">(</span>QWidget <span class="token operator">*</span>parent <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">17</span> <span class="token operator">~</span><span class="token function">Widget</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">18</span> <span class="token number">19</span> <span class="token keyword">private</span><span class="token operator">:</span> <span class="token number">20</span> <span class="token comment">/* 声明5个 QRadioButton 对象 */</span> <span class="token number">21</span> QRadioButton <span class="token operator">*</span>radioButton1<span class="token punctuation">;</span> <span class="token number">22</span> QRadioButton <span class="token operator">*</span>radioButton2<span class="token punctuation">;</span> <span class="token number">23</span> QRadioButton <span class="token operator">*</span>radioButton3<span class="token punctuation">;</span> <span class="token number">24</span> QRadioButton <span class="token operator">*</span>radioButton4<span class="token punctuation">;</span> <span class="token number">25</span> QRadioButton <span class="token operator">*</span>radioButton5<span class="token punctuation">;</span> <span class="token number">26</span> <span class="token comment">/* 声明 QButtonGroup对象 */</span> <span class="token number">27</span> QButtonGroup <span class="token operator">*</span>button_group<span class="token punctuation">;</span> <span class="token number">28</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token number">29</span> #endif <span class="token comment">// WIDGET_H</span> </code></pre> <h3> <a id="544__widgetcpp_222"></a>5.4.4 修改 <code>widget.cpp</code> </h3> <pre><code class="prism language-cpp"><span class="token number">1</span> #include <span class="token string">"widget.h"</span> <span class="token number">2</span> <span class="token number">3</span> <span class="token class-name">Widget</span><span class="token double-colon punctuation">::</span><span class="token function">Widget</span><span class="token punctuation">(</span>QWidget <span class="token operator">*</span>parent<span class="token punctuation">)</span> <span class="token number">4</span> <span class="token operator">:</span> <span class="token function">QWidget</span><span class="token punctuation">(</span>parent<span class="token punctuation">)</span> <span class="token number">5</span> <span class="token punctuation">{<!-- --></span> <span class="token number">6</span> <span class="token comment">/* 主窗体设置位置和显示的大小 */</span> <span class="token number">7</span> <span class="token keyword">this</span><span class="token operator">-></span><span class="token function">setGeometry</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">800</span><span class="token punctuation">,</span> <span class="token number">480</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">8</span> <span class="token number">9</span> <span class="token comment">/*将主窗口背景色设置为天蓝色(不透明度为 100%)*/</span> <span class="token number">10</span> <span class="token keyword">this</span><span class="token operator">-></span><span class="token function">setStyleSheet</span><span class="token punctuation">(</span><span class="token string">"Widget { background-color: rgba(135, 206, 250, 100%); }"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">11</span> <span class="token number">12</span> <span class="token comment">/* 实例化5个QRadioButton单选按钮对象 */</span> <span class="token number">13</span> radioButton1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">QRadioButton</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">14</span> radioButton2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">QRadioButton</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">15</span> radioButton3 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">QRadioButton</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">16</span> radioButton4 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">QRadioButton</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">17</span> radioButton5 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">QRadioButton</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">18</span> <span class="token number">19</span> <span class="token comment">// 创建一个按钮组 QButtonGroup 对象</span> <span class="token number">20</span> button_group <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">QButtonGroup</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">21</span> <span class="token number">22</span> <span class="token comment">/* 设置第一组两个 QRadioButton 的位置和显示大小 */</span> <span class="token number">23</span> radioButton1<span class="token operator">-></span><span class="token function">setGeometry</span><span class="token punctuation">(</span><span class="token number">280</span><span class="token punctuation">,</span> <span class="token number">140</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">24</span> radioButton2<span class="token operator">-></span><span class="token function">setGeometry</span><span class="token punctuation">(</span><span class="token number">420</span><span class="token punctuation">,</span> <span class="token number">140</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">25</span> <span class="token number">26</span> <span class="token comment">/* 设置第二组3个 QRadioButton 的位置和显示大小 */</span> <span class="token number">27</span> radioButton3<span class="token operator">-></span><span class="token function">setGeometry</span><span class="token punctuation">(</span><span class="token number">140</span><span class="token punctuation">,</span> <span class="token number">290</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">28</span> radioButton4<span class="token operator">-></span><span class="token function">setGeometry</span><span class="token punctuation">(</span><span class="token number">340</span><span class="token punctuation">,</span> <span class="token number">290</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">29</span> radioButton5<span class="token operator">-></span><span class="token function">setGeometry</span><span class="token punctuation">(</span><span class="token number">540</span><span class="token punctuation">,</span> <span class="token number">290</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">30</span> <span class="token number">31</span> <span class="token comment">/* 设置第一组两个 QRadioButton 的显示文本 */</span> <span class="token number">32</span> radioButton1<span class="token operator">-></span><span class="token function">setText</span><span class="token punctuation">(</span><span class="token string">"开关一"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">33</span> radioButton2<span class="token operator">-></span><span class="token function">setText</span><span class="token punctuation">(</span><span class="token string">"开关二"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">34</span> <span class="token number">35</span> <span class="token comment">/* 设置第二组3个 QRadioButton 的显示文本 */</span> <span class="token number">36</span> radioButton3<span class="token operator">-></span><span class="token function">setText</span><span class="token punctuation">(</span><span class="token string">"选择一"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">37</span> radioButton4<span class="token operator">-></span><span class="token function">setText</span><span class="token punctuation">(</span><span class="token string">"选择二"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">38</span> radioButton5<span class="token operator">-></span><span class="token function">setText</span><span class="token punctuation">(</span><span class="token string">"选择三"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">39</span> <span class="token number">40</span> <span class="token comment">/* 第一组 QRadioButton 使用样式表1设置 */</span> <span class="token number">41</span> radioButton1<span class="token operator">-></span><span class="token function">setObjectName</span><span class="token punctuation">(</span><span class="token string">"radiogroup1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">42</span> radioButton2<span class="token operator">-></span><span class="token function">setObjectName</span><span class="token punctuation">(</span><span class="token string">"radiogroup1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">43</span> <span class="token number">44</span> <span class="token comment">/* 第二组 QRadioButton 使用样式表2设置 */</span> <span class="token number">45</span> radioButton3<span class="token operator">-></span><span class="token function">setObjectName</span><span class="token punctuation">(</span><span class="token string">"radiogroup2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">46</span> radioButton4<span class="token operator">-></span><span class="token function">setObjectName</span><span class="token punctuation">(</span><span class="token string">"radiogroup2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">47</span> radioButton5<span class="token operator">-></span><span class="token function">setObjectName</span><span class="token punctuation">(</span><span class="token string">"radiogroup2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">48</span> <span class="token number">49</span> <span class="token comment">/*第一组的2个 单选控件,使用 Qt 默认的分组功能*/</span> <span class="token number">50</span> <span class="token number">51</span> <span class="token comment">/*将第二组三个单选按钮对象添加到按钮组 button_group*/</span> <span class="token number">52</span> button_group<span class="token operator">-></span><span class="token function">addButton</span><span class="token punctuation">(</span>radioButton3<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">53</span> button_group<span class="token operator">-></span><span class="token function">addButton</span><span class="token punctuation">(</span>radioButton4<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">54</span> button_group<span class="token operator">-></span><span class="token function">addButton</span><span class="token punctuation">(</span>radioButton5<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">55</span> <span class="token number">56</span> <span class="token comment">/*设置第二组按钮成员为互斥*/</span> <span class="token number">57</span> button_group<span class="token operator">-></span><span class="token function">setExclusive</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">58</span> <span class="token number">59</span> <span class="token comment">/* 第一组设置初始状态,radioButton1 的 Checked 为 true,另一个为 false*/</span> <span class="token number">60</span> <span class="token number">61</span> radioButton1<span class="token operator">-></span><span class="token function">setChecked</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">62</span> radioButton2<span class="token operator">-></span><span class="token function">setChecked</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">63</span> <span class="token number">64</span> <span class="token number">65</span> <span class="token comment">/* 第二组设置初始状态,rradioButton3 的 Checked 为 true,另两个为 false*/</span> <span class="token number">66</span> radioButton3<span class="token operator">-></span><span class="token function">setChecked</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">67</span> radioButton4<span class="token operator">-></span><span class="token function">setChecked</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">68</span> radioButton5<span class="token operator">-></span><span class="token function">setChecked</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token number">69</span> <span class="token punctuation">}</span> <span class="token number">70</span> <span class="token number">71</span> <span class="token class-name">Widget</span><span class="token double-colon punctuation">::</span><span class="token operator">~</span><span class="token function">Widget</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token number">72</span> <span class="token punctuation">{<!-- --></span> <span class="token number">73</span> <span class="token punctuation">}</span> </code></pre> <h2> <a id="55_Kit_299"></a>5.5 切换Kit,获得运行在不同系统中的运行的执行文件</h2> <p>点击窗口左边的Debug,可以选择编译运行在不同平台上的可执行文件,arm-v7为arm架构的设备,使用Qt4库,而桌面则是当前ubuntu系统,使用Qt5。<br> Qt5编译完成的可执行程序<code>_qcheckbox</code>,存放在项目目录的<code>build-_qcheckbox-unknown-Debug/</code>文件夹下,Qt4编译完成的可执行程序<code>_qcheckbox</code>,存放在项目目录的<code>build-_qcheckbox-arm_v7-Debug/</code>文件夹下。</p> <h2> <a id="56_qt_303"></a>5.6 程序中的qt机制</h2> <h3> <a id="561_Resource_305"></a>5.6.1 资源(Resource)</h3> <p>在 Qt 中,资源(Resource)指的是应用程序中的特殊文件,如图像、文本等。Qt资源系统将这些资源文件封装为资源文件(Resource File),并将它们存储在.qrc文件中,然后使用rcc工具(编译时rcc工具会自动被调用)将.qrc文件编译成一种二进制格式,并与应用程序的可执行文件或库一并打包存储。</p> <p>通过 Qt 提供的资源管理类可以方便的访问这些资源,这样可以有效地避免了文件路径问题以及繁琐的资源查找流程。使用 Qt 资源系统,可以使开发者更加方便地管理和使用应用程序中的资源,提高应用程序的质量和开发效率。</p> <p>在我们的_radiobutton项目中,将4个图片文件和一个.qss样式表文件作为资源文件添加到.qrc文件。</p> <h4> <a id="5611_qss__312"></a>5.6.1.1 qss 样式表文件</h4> <p>.qss 文件是一个 Qt 样式表文件,用于为应用程序中的部件(例如按钮、文本框、标签等)定义自定义样式。它可以包含一些常规的样式属性,如字体、颜色、背景和边框设置,也可以包含复杂的样式设置,如图像背景、渐变色和阴影效果。<br> 使用 .qss 文件,可以改变 Qt 部件的外观和行为,以匹配应用程序的主题和风格。可以选择遵循现有的样式规则,也可以通过定义自己的样式规则来创建全新的外观效果。.qss 文件是一种非常灵活和强大的方法,可以实现几乎任何自定义样式的要求。<br> 事实上,Qt 应用程序中的样式文件名称可以完全自定义,只要在应用程序中正确地引用了它们即可。将样式表文件保存为 .qss 扩展名是一种推荐的做法,因为它可以让其他开发人员快速理解某个文件的用途。为节省时间并简化管理,通常建议将样式表文件保存在应用程序的一个单独目录中,并使用一致的命名约定。例如,可以将所有的样式表文件保存在 styles 目录下,并按照 theme_name.qss 的格式命名,其中 theme_name 是想要使用的主题名称。这样做可以使文件命名和管理更加清晰,并使代码更加易于维护。<br> 如果不想使用样式表文件,仍然可以使用 setStyleSheet() 方法将样式定义直接嵌入到 Qt 应用程序的代码中,这样的做法会让应用程序的代码和布局变得混乱且难以维护。</p> <h4> <a id="5612__317"></a>5.6.1.2 图片文件</h4> <p>QRadioButton 支持的图片文件类型包括:<br> PNG 格式:PNG 格式是 Qt 支持的最常用的图片格式之一,它支持透明度和 alpha 通道,并且可以轻松地在不同的平台上进行交互和显示。<br> BMP 格式:BMP 格式也是 Qt 支持的常用图片格式之一,它可以在不同的平台上轻松地进行交互和显示。<br> GIF 格式:GIF 格式是一种支持动画和透明度的图片文件格式,但是它有一些限制,比如只支持 256 色。<br> JPEG 格式:JPEG 格式是一种常用的压缩图片格式,它可以在 Qt 中使用,并且可以配置图片质量。<br> SVG 格式:SVG 是一种矢量图形格式,可以在 Qt 中使用,并支持缩放和动画。<br> 总的来说,QRadioButton 支持很多种图片格式,主要包括 PNG、BMP、GIF、JPEG 和 SVG 等,开发者可以根据自己的需要选择合适的图片格式。</p> <h3> <a id="562__QButtonGroup_327"></a>5.6.2 按钮组 QButtonGroup</h3> <p>ButtonGroup 是用于管理一组按钮的控件。它能够在一组互斥的按钮中,确保只有一个按钮被选中。当用户点击这组按钮中的一个按钮时,QButtonGroup 将会自动检测其中的选中状态并更新其它按钮的选中状态,以确保只有一个按钮被选中。<br> QButtonGroup 可以管理多种类型的按钮控件,包括:</p> <ul> <li>QCheckBox:复选框。</li> <li>QRadioButton:单选框。</li> <li>QPushButton:普通按钮。</li> <li>QAbstractButton 或其子类:抽象按钮或其子类,如 QToolButton、QCommandLinkButton、QAbstractSpinBox 和 QComboBox 等。<br> QButtonGroup 可以通过 setExclusive() 函数实现对其管理的一组按钮的互斥性控制.</li> </ul> <blockquote> <p>虽然 QButtonGroup 可以像容器一样管理一组按钮,但事实上 QButtonGroup 并不是容器控件,而是 Qt 的一种支持控件。容器控件用于管理(即容纳)其他控件,例如 QWidget、QFrame、QSplitter 等,可以将多个控件作为其子控件添加到其内部,形成一个层次化的控件树。而 QButtonGroup 只是用于管理一组互斥的按钮,它并没有作为容器控件来管理其他控件。</p> </blockquote> <h1> <a id="_340"></a>总结</h1> <p>本例程为QRadioButton 单选按钮编程。通过这个例子,初步了解QT管理资源机制,以及如何分组管理QRadioButton 单选按钮。项目演示如何使用默认的分组和 QButtonGroup 进行互斥设置,保证多个选项所在的组内只有一个被选中。项目使用样式表文件将两组按钮使用不同的样式表进行外观设置。<br> 文章中使用的例程和内容都是在chatgpt的帮助下完成的,例程经过测试通过。</p> </div> <link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-98b95bb57c.css" rel="stylesheet"> <link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-c216769e99.css" rel="stylesheet"> </div> <div id="treeSkill"></div></article>
Qt常用的按钮控件编程(三)-- QRadioButton 按钮
作者
sockstack
许可协议
CC BY 4.0
发布于
2024-02-27
修改于
2025-02-05
上一篇:软件:常用 Linux 软件汇总,值得收藏
下一篇:高级技术专家详解:基于阿里云 eRDMA 的 GPU 实例如何大幅提升多机训练性能
尚未登录
登录 / 注册
文章分类
博客重构之路
5
Spring Boot简单入门
4
k8s 入门教程
0
MySQL 知识
1
NSQ 消息队列
0
ThinkPHP5 源码分析
5
使用 Docker 从零开始搭建私人代码仓库
3
日常开发汇总
4
标签列表
springboot
hyperf
swoole
webman
php
多线程
数据结构
docker
k8s
thinkphp
mysql
tailwindcss
flowbite
css
前端