Qt输入窗口部件编程(一) QComboBox和QFontComboBox

文章目录

  • 前言
  • 1、 Qt常用的输入窗口控件
  • 2、QFontComboBox 和 QComboBox控件编程
    • 2.1 控件简介
      • 2.1.1 QComboBox组合框
      • 2.1.2 QFontComboBox字体组合框
    • 2.2 例程功能设计
    • 2.3 例程执行效果
    • 2.4 生成项目
    • 2.5 代码编辑
      • 2.5.1 修改项目文件_qcombobox.pro
      • 2.5.2 修改 `main.cpp`
      • 2.5.3 修改 `widget.h`
      • 2.5.4 修改 `widget.cpp`
    • 2.6 切换Kit,获得运行在不同系统中的运行的执行文件
    • 2.7 程序中的qt机制分析
      • 2.7.1 qt4与qt5信号与槽函数的连接方式比较
  • 总结


前言

从本文开始,我们系列文章开始介绍Qt输入窗口部件编程。本文介绍QComboBox组合框和 QFontComboBox字体组合框编程。通过这个例子,继续巩固QT的信号与槽知识,了解qt4与qt5信号与槽函数的连接方式的不同。

本例程设计是在chatgpt的帮助下完成的,编译代码经过测试通过。

感谢朋友提供的chatgpt软件,特别是其中的gpt-box桌面工具,更是我离不开的工具。感兴趣的同仁可前往一观( www.apsuai.com)。

我们的调试环境仍然是双架构Kits,编译调试在当前的ubuntu(qt5)中进行,重新编译后下载到目标arm设备(qt4)中运行。
我们的编程环境为:Ubuntu64位系统(22.04),目标架构:
(1) qt5 x86_64 架构;
(2)qt4 32位arm架构。
环境配置请参见《Qt常用的按钮控件编程(一)》第1节。


1、 Qt常用的输入窗口控件

在这里插入图片描述

  1. Comb Box:组合框
  2. Font Comb Box:字体组合框
  3. Line Edit:单行编辑框
  4. Text Edit:文本编辑框
  5. Plain Text Edit:纯文本编辑框
  6. Spin Box:数字旋转框
  7. Double Spin Box:双精度数字旋转框
  8. Time Edit:时间编辑框
  9. Date Edit:日期编辑框
  10. Date/Time Edit:日期时间编辑框
  11. Dial:数字拨盘框
  12. Horizontal Scroll Bar:水平滚动条
  13. Vertical Scroll Bar:垂直滚动条
  14. Horizontal Slider:水平滑动条
  15. Vertical Slider:垂直滑动条
  16. Key sequence Edit:按键序列编辑框
    在以后编程示例中我们会详细介绍这些控件。

2、QFontComboBox 和 QComboBox控件编程

2.1 控件简介

2.1.1 QComboBox组合框

QComboBox是Qt中的一个控件类,用户可以从下拉列表中选择一个值。当用户点击下拉箭头,一个列表就会展开,以显示可用选项。用户可以从列表中选择一个选项,所选选项将作为组合框的当前值。
QComboBox是一个强大的组合框控件,可以用于在GUI中选择从一组值中选择的值。例如,在绘图应用中,可以使用QComboBox来选择画笔颜色、字体、线型等。QComboBox也可以用于选择文件格式、数据源等。

以下是QComboBox的一些常用函数和信号:

  • addItem(text: str, userData: Any = None): 向下拉列表框中添加一个选项。
  • removeItem(index: int): 从下拉列表框中移除指定的选项。
  • clear(): 清除下拉列表框中的所有选项。
  • currentTextChanged(text: str): 当用户选择新选项时,发出此信号。

2.1.2 QFontComboBox字体组合框

QFontComboBox是QComboBox类的一个子类,继承了QComboBox的所有功能。QFontComboBox是Qt为了方便开发者使用而提供的一个特殊控件,可以将其视为Qt的语法糖。它大大简化开发过程,并使代码更易于理解和维护,但其实它内部实现并不简单,需要扫描操作系统中所有已安装的字体,并格式化这些字体进行显示,同时提供信号来捕获所选字体的更改。

2.2 例程功能设计

向chatgpt提出的要求如下:
“使用Qt Creator 创建一个c++例程,项目名称"_qcombobox" ,基类不选默认MainWindow类,而选择Widget作为基类,不要勾选“Generate form”,不使用拖取控件,控件全部采用编程。主窗口大小800*480。在主窗口上,放置一个 QComboBox控件控件用来选择颜色,放置一个 QFontComboBox 控件用来选择字体,选择后,用槽函数将综合选择的结果体现在一个QTextEdit控件中。“
chatgpt根据要求给出了完整的例程,经过少量调整就能满足我们的需求。

2.3 例程执行效果

在主窗口上,左上放置一个 QComboBox控件,点击后显示的下拉框可以改变下部文本框(QTextEdit控件)选中文本的颜色,右上放置一个QFontComboBox控件,点击后出现许多中文字体可供选择,选中其中之一,文本框中的全部内容会按照选择的字体发生改变,如下图:

在这里插入图片描述

2.4 生成项目

使用Qt Creator 创建一个c++例程,项目名称"_qcombobox" ,不选默认MainWindow类,选择Widget作为基类,不要勾选“Generate form”,不使用拖取控件,控件全部采用编程。将两个配置好的Kits同时选上,项目新建完成如下图。(详细的项目新建过程参见:《Qt常用的按钮控件编程(一)》)。
在这里插入图片描述
点击左侧的Debug选项,可以看到两个编译套件Kit,可以选择编译运行在不同平台上的可执行文件,arm-v7为arm架构的设备,使用Qt4库,而桌面则是当前ubuntu系统,使用Qt5。

2.5 代码编辑

2.5.1 修改项目文件_qcombobox.pro

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.h# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target# 根据使用的 Qt 版本设置编译条件
greaterThan(QT_MAJOR_VERSION, 4) {# 如果使用的是 Qt 5 或者更新版本message("使用的是 Qt 5版本")} else {# 如果使用的是 Qt 4 或者更早的版本message("使用的是 Qt 4版本")DEFINES += QT_ARM_PLATFORMQMAKE_CXXFLAGS += -std=c++11QMAKE_CXXFLAGS += -Wno-psabi -Wno-deprecated-declarationsLIBS += -lts}

2.5.2 修改 main.cpp

#include "widget.h"#include <QApplication>
#ifdef QT_ARM_PLATFORM
#include <QTextCodec>
#endif
int main(int argc, char *argv[])
{QApplication a(argc, argv);#ifdef QT_ARM_PLATFORM//解决Qt4中文乱码QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));QTextCodec::setCodecForTr(QTextCodec::codecForName("system"));    //若英文系统,则用GBKQTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
#endifWidget w;w.show();return a.exec();
}

2.5.3 修改 widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QComboBox>
#include <QFontComboBox>
#include <QTextEdit>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void setColor(int index);void setFont(const QFont &font);private:QComboBox *colorComboBox;QFontComboBox *fontComboBox;QTextEdit *textEdit;QHBoxLayout *comboLayout;QVBoxLayout *layout;};
#endif // WIDGET_H

2.5.4 修改 widget.cpp

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{setWindowTitle("ComboBox Example");resize(800, 480);colorComboBox = new QComboBox;
#ifdef QT_ARM_PLATFORM
/*对于 Qt4,其中的 C++11 功能实现是不完整的,因此很多 C++11 的新特性是无法使用的,比如必须使用分离引用声明方式初始化 QString 对象 QStringList。*/QStringList colors;colors << "Red" << "Green" << "Blue";
#else
/*在 Qt5 的连接语法中,我们可以使用分离引用声明方式({}语法)来初始化 QObject 的对象或其子类。*/QStringList colors = {"Red", "Green", "Blue"};
#endifcolorComboBox->addItems(colors);fontComboBox = new QFontComboBox;fontComboBox->setWritingSystem(QFontDatabase::SimplifiedChinese);textEdit = new QTextEdit("你好 Qt 例程!!!!");textEdit->setFont(QFont("宋体", 28));comboLayout = new QHBoxLayout();comboLayout->addWidget(colorComboBox);comboLayout->addWidget(fontComboBox);layout = new QVBoxLayout();layout->addLayout(comboLayout);layout->addWidget(textEdit);this->setLayout(layout);#ifdef QT_ARM_PLATFORMconnect(colorComboBox, SIGNAL(activated(int)), this, SLOT(setColor(int)));connect(fontComboBox, SIGNAL(currentFontChanged(QFont)), this, SLOT(setFont(QFont)));
#elseconnect(colorComboBox, QOverload<int>::of(&QComboBox::activated), this, &Widget::setColor);connect(fontComboBox, &QFontComboBox::currentFontChanged, this, &Widget::setFont);#endif}Widget::~Widget()
{
}void Widget::setColor(int index)
{switch (index) {case 0:textEdit->setTextColor(Qt::red);break;case 1:textEdit->setTextColor(Qt::green);break;case 2:textEdit->setTextColor(Qt::blue);break;}
}void Widget::setFont(const QFont &font)
{QFont font1=font;font1.setPointSize(28);textEdit->setFont(font1);
}

2.6 切换Kit,获得运行在不同系统中的运行的执行文件

点击窗口左边的Debug,可以选择编译运行在不同平台上的可执行文件,arm-v7为arm架构的设备,使用Qt4库,而桌面则是当前ubuntu系统,使用Qt5。(参见2.4节)
Qt5编译完成的可执行程序_qcombobox,存放在项目目录的build-_qcombobox-unknown-Debug/文件夹下,Qt4编译完成的同名可执行程序_qcombobox,存放在项目目录的build-_qcombobox-arm_v7-Debug/文件夹下。

将程序下载到多台设备arm设备上测试,大多数设备上Font Comb Box能够正常工作,而某些设备则出现触摸完全无效的情况,这是由于很多输入窗口控件在Qt4、tslib环境下工作不正常所致,如果希望彻底解决问题,最好将系统升级到Qt5。

2.7 程序中的qt机制分析

2.7.1 qt4与qt5信号与槽函数的连接方式比较

在前面的代码中,qt4的连接方式:

   connect(colorComboBox, SIGNAL(activated(int)), this, SLOT(setColor(int)));connect(fontComboBox, SIGNAL(currentFontChanged(QFont)), this, SLOT(setFont(QFont)));

而在qt5中,代码如下:

connect(colorComboBox, QOverload<int>::of(&QComboBox::activated), this, &Widget::setColor);
connect(fontComboBox, &QFontComboBox::currentFontChanged, this, &Widget::setFont);

在 Qt4 中,我们使用 SIGNAL 和 SLOT 宏来连接信号和槽函数,需要在编译时进行字符串匹配,这种方式存在以下几个限制:

  • 一些字符串的名字不容易重构或改写,对翻译的支持也不够良好;
  • 对于多重重载函数,必须手动将参数写成字符串,并且和函数实际的参数类型及个数完全匹配;
  • 必须写出 Qt 提供的信号和槽函数的名称,反射机制不够灵活。

而在 Qt5 中,我们可以使用更安全、类型安全的函数指针连接两个对象的信号和槽函数,避免了字符串相关的限制和风险,提供了更加完善和方便的信号槽组合。使用 QOverload 来连接重载的信号和槽函数,它具有以下优势:

  • 可以在 compile time(编译时间) 保证参数类型和数目正确,避免了类型安全问题;
  • 可以通过函数指针灵活地选择任何重载,不必指定参数类型字符串;
  • 更稳健、更高效、更具有可读性。

“compile time”(编译时间),是指程序的编译期间,也就是源代码被编译器编译成可执行文件之前的时间段。这个阶段的操作包括词法分析、语法分析、语义分析、代码生成、优化等,可以将源代码转换为机器代码或字节码等。
“runtime”(运行时)是指程序的执行期间,也就是可执行文件开始执行到结束的时间段。这个时间段的操作包括栈和堆的分配、变量赋值、函数调用、I/O 操作等与计算机硬件和操作系统相关的的操作。

总结

本文介绍QComboBox组合框和 QFontComboBox字体组合框编程。例程的设计是在chatgpt的帮助下完成的。
AI 技术的快速发展将深刻地改变我们生活的各个方面。chatgpt 的自动代码生成功能给予了程序员一个全新的编程体验,只需要清晰地描述需求,chatgpt 就可以为我们提供相应的代码建议,极大地提高了开发效率和准确性。只需要少量的修改和调整,便可以轻松地将它们应用于实际项目中。
当前的chatgpt由于对篇幅的限制,目前还不能做比较大的项目,但已经能够为我们提供很多的代码模块,大大减轻了开发强度和难度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22552.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xmind8 乱码问题解决(查看文件字体并下载安装相应字体)

每台电脑引起Xmind软件出现乱码的原因也不一样&#xff0c;本文仅适用于解决字体缺少或者字体版本不对而引发的乱码问题。每台电脑缺少的字体包也不一样&#xff0c;要通过“工具”-》“提取样式”菜单&#xff0c;具体分析自己的Xmind文件需要什么字体&#xff0c;然后搜索对应…

idea主题 插件 乱码 快捷键

idea样式网站 http://www.easycolor.cc/ http://www.riaway.com/ idea 乱码情况 中文乱码问题分类&#xff1a; 1.编码普通中文乱码 2.properties文件中文乱码 3.console控制台中文乱码 4.搜索框中文乱码 5.svn注释中文乱码 解决方法&#xff1a; 1、编码普通中文乱码 ①s…

基于声学模型共享的零资源韩语识别系统

声学模型共享方法是极低资源小语种语音识别一种解决方案&#xff0c;能够实现不需要任何语音数据的语音识别。本文介绍清华大学语音与音频技术实验室的零资源韩语语音系统&#xff0c;其在不使用任何韩语语音数据的情况下&#xff0c;在Zeroth韩语数据集上的测试CER达到了27.33…

韩语在线翻译图片识别_图片怎么转表格excel

图片转表格excel&#xff0c;快来免费用 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 相信大部分小伙伴选择拍图识字 是因为强大的ocr识别功能 图片文字一键提取导出 但是&#xff0c;有多少人知道 拍图识字还可以成为你的私人翻译&#xff01;1 多语言转换 拍图识字首页点击拍照/…

韩译中难吗,如何做好韩语翻译

我们知道&#xff0c;韩语是韩国的官方语言&#xff0c;由于长期和中国文化的接触&#xff0c;历史上曾用汉字标记&#xff0c;并且将汉语融入其词汇&#xff0c;基于这一特点&#xff0c;韩译中难吗&#xff0c;如何做好韩语翻译? 据了解&#xff0c;中韩文化交流的历史可以追…

韩语在线翻译图片识别_3个OCR文字识别工具,最后一个许多人都不知道!

在日常生活和工作中,经常有需要录入一张图片或实物内容的文字信息的时候,对于少量内容,你或许可以轻松完成。可是一旦内容多,而你打字速度又不快的情况下,那可真的是一件非常枯燥又费力的事情。 而一般遇到这种情况,大家就可以利用OCR文字识别工具,只需简单对着物体拍张…

韩语在线翻译图片识别_如何用扫描全能王将图片转成文字?

扫描君有个写材料的朋友&#xff0c;每次需要摘录书或宣传册里的内容&#xff0c;他总是一个字一个字地敲&#xff0c;效率不高&#xff0c;还容易出错&#xff0c;自己也很痛苦&#xff01;&#xff01; 扫描君也有这样的亲身体会&#xff1a; 在微博、朋友圈里看到一些图片或…

韩语翻译拍照怎么弄?分享几款拍照翻译软件

拍照翻译软件是一种基于人工智能技术开发的翻译工具&#xff0c;它可以通过拍照识别文字&#xff0c;然后将文字翻译成大家选择的语言。这种翻译方式比传统的输入文字翻译更加方便快捷&#xff0c;无需手动输入文字&#xff0c;提高了翻译的效率、准确性&#xff0c;也提供更好…

yandex的“Search queries” report(搜索查询报告)

上一篇提到了我们查询访客关键词的入口&#xff0c;需要从“搜索查询”报告中点击进入&#xff0c;那么我们好好的来了解一下其中数据的具体含义吧~ 首先&#xff1a;该报告包含来自投放您的广告的搜索平台的用户查询&#xff0c;包括与您的关键字在语义上匹配的搜索查询。这句…

韩语识别_韩语文字识别_韩语图片识别 - 云+社区 - 腾讯云

广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 购买预付费包更加优惠 识别 小时语音不到 元 每月赠送免费额度最大程度降低客户成本 效果好 字准率 处于业界领先水平 与微信王者荣耀的语音转文字使用一套服…

【pdf翻译中文】免费自用日语pdf转中文、韩语pdf转中文(也可以转英文)或者其他小语种法语、德语pdf转中文

不是很精确、有点慢&#xff0c;但是也够用&#xff0c;胜在免费free 效果图&#xff1a; 一些对比&#xff1a; 模型来自于&#xff1a; https://huggingface.co/models 文件目录 调用模型的代码&#xff1a; 运行此段代码&#xff0c;执行翻译 一些简单的设置在这里…

在线翻译_英汉互译,支持繁体,韩语,日语 - 微信小程序在线翻译,单词句子翻译

打开微信&#xff0c;搜索页面 输入&#xff1a;超实用工具箱 找到上图所示的小程序点击打开&#xff0c;在菜单栏中找到【在线翻译】&#xff0c;点开进入翻译页面 有多种语言可以选择&#xff1a;英文&#xff0c;简体中文&#xff0c;香港&#xff0c;台湾&#xff0c;韩语&…

韩语在线翻译图片识别_最强文字识别APP

在我们日常生活和办公中&#xff0c;处理纸质文档上的文字是必不可免的&#xff0c;而当我们需要快速把纸质上的文字转换成可编辑的电子文档时候&#xff0c;如果单靠打字输入的话往往令人有点头疼&#xff0c;特别是面对字数众多的文本。此时此刻&#xff0c;一个识别准确 OCR…

【韩语图片文字识别】如何快速识别韩语图片文字,将文字变成电子档,进行翻译处理教程

场景&#xff1a;在韩语学习&#xff0c;韩语工作中经常遇到一些文字图片&#xff0c;如何将韩语图片文字从图片上扣下来&#xff0c;我们可以直接复制粘贴&#xff0c;提高我们的工作效率 我们会用到一款小工具&#xff1a;咕嘎ocr多语言文字识别系统 软件下载链接&#xff…

网站接入qq客服在线聊天

一. 注册一个网站专用QQ。 二. 到QQ商家设置QQ在线状态&#xff1a;http://wp.qq.com/set.html 免费开通设置会话类型 三、生成代码 四、将代码粘贴到自己的网站上&#xff0c;之后访客就可以点击图标给网站客服QQ留言了。

网站在线沟通工具,网站即时聊天工具-TTKEFU在线客服系统功能介绍

接待多渠道顾客——PC简洁版 TTKEFU客服打通web网站、移动网站、微信、APP、电话、表单、邮件等等&#xff0c;无论顾客来自于哪个渠道&#xff0c;都可以在TTKEFU客服后台统一接待。 接待多渠道顾客——PC工作台版 整合同一顾客在不同渠道不同场景的碎片化行为&#xff0c;将…

中国存储“军团”补位美光,存储芯片的垄断格局要崩了

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 2023年5月21日晚间&#xff0c;中国网络安全审查办公室官网发布了美光公司在华销售的产品未通过网络安全审查的结果。 来源&#xff1a;cac.gov.cn 公告内容显示&#xff0c;审查发现&#xff0c;美光公司产品存在较严重网络…

​汇集198篇论文,首篇关于Segment Anything Model的综述来了!

©PaperWeekly 原创 作者 | 小马 单位 | FightingCV公众号运营者 研究方向 | 计算机视觉 写在前面 四月份&#xff0c;AI Research 提出的基础分割模型 Segment Anything Model&#xff08;SAM&#xff09;火爆了整个网络&#xff0c;各种基于 SAM 的二创项目也如雨后春笋…

360集团副总裁梁志辉:大模型驱动的AI数字员工,将带来一场深刻的生产力变革丨数据猿专访...

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 近日&#xff0c;在360智脑大模型应用发布会上&#xff0c;360集团创始人周鸿祎在现场创造了自己的数字分身&#xff0c;充当360公司的新闻发言人&#xff0c;其行为和思维方式可以仿真周鸿祎本人。 据悉&#xff0c;数字人…

两周时间,我体验了 GPT-4 从编程‘神器’变成编程‘智障’!

前言 两周前&#xff0c;我让 GPT-4 从头编写一款应用程序。由于这段经历感觉良好&#xff0c;当时我认为 GPT-4 是非常强大的编程伙伴。然而&#xff0c;上周末我让 GPT-4 扩展这款应用程序&#xff0c;却有了完全不同的体验。 因此&#xff0c;我想通过本文记录整个过程&…