Qt5(一)编写Qt多窗口程序

2023-11-16


本文作者:小嗷

微信公众号:aoxiaoji

吹比QQ群:736854977

链接:https://f600lt.github.io/archives/


摘要 : 这篇开始将从基础知识点开始一步一步QT到QT项目(原因就是读者说,QT类很多看不懂),这篇我们将实现多个窗口的切换显示。程序要实现的功能是:

一般来说,我们登录后,登录界面会自动的关闭以及我们需要填写注册信息时,会打开2个界面。

一、创建项目

1.首先打开Qt软件,新建一个Qt应用项目,项目名称设置为hahaha(不要取中文名),在类界面选择基类为QMainWindow、类名为MainWindow,这样将会生成一个主窗口界面。

2.完成创建后,双击ui文件进入设计模式,从左侧部件列表中向界面上拖入一个Push Button到界面,然后双击并修改显示文本为“按钮”,如下图所示:

3.可以通过Ctrl+R快捷键运行一次程序。在设计模式可以对界面进行修改,当然,代码也可以完成相同的功能。如下“二”为代码显示文本。

二、代码显示文本

1.按Ctrl+2快捷键或点击Qt左边的“编辑”按钮进入编辑模式,MainWindow.cpp文件来编辑按钮内容。向构造函数MainWindow()添加一行代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->pushButton->setText("新窗口"); //将界面上按钮的显示文本更改为“新窗口”
}

这里的ui对象就是界面文件对应的类的实例,在.h文件中对其进行了定义,可以通过它来访问设计模式添加到界面上的部件。前面添加的按钮Push Button,在其属性面板上可以看到它的objectName属性的默认值为pushButton(当然我们自己也可以修改一下),这里就是通过这个属性来获取部件对象的。

这里使用了QPushButton类的setText()功能函数来设置按钮的显示的文字,再次使用Ctrl+R快捷键运行程序,效果如下图所示。

2.我们能观察到,通过代码来设置按钮的显示文字(中文)会覆盖掉以前在设计模式设置的文本。在代码中直接使用中文文字本不是一个好的习惯,建议在编写程序时使用英文,当程序完成后使用Qt语言家来翻译整个软件中要显示的字符串,这个在后面的例子中会讲到。本篇中为了简单快键,一般会直接在代码中使用中文,但是为了以后可以进行国际化翻译,在界面上显示的字符串一般使用tr()函数包含,在这里我们将修改按钮显示文本的代码更改为:

ui->pushButton->setText(tr("新窗口"));

再次运行,如果感觉编辑器中的字体太小,可以使用快键键Ctrl + +(同时按下Ctrl和加号键)来进行放大,使用Ctrl+ -可以缩小,Ctrl+0可以回复默认大小。

三、添加登录界面

1.往项目中添加新文件,这里可以在编辑模式里左侧的项目目录上右击,然后选择添加新文件菜单,如下图所示。当然也可以在文件菜单中进行添加。

选中项目为蓝色

2.模板选择Qt,然后选择Qt设计师界面类,然后界面模板选择Dialog withoutButtons(当然选择其他都是可以),如下图所示。

6.PNG

3.单击下一步进入类信息界面,将类名更改为LoginDlg(注意类名首字母一般大写,而对象名为小写开头)。如下图所示,相关文件会自动改名。

7.PNG

4.当完成后会自动跳转到设计模式,可以对新添加的对话框进行设计。小嗷向界面上拖入一个Push Button按钮,然后更改文本为“XXX”。为了实现点击按钮后可以自动关闭对话框并显示另外窗口,我们要设置信号和槽。点击设计模式上方的一个小便签 图标,或者直接按F4,便进入了设计界面的信号和槽编辑模式。按着鼠标左键,从按钮上拖向界面,操作如下:

9.PNG

当小嗷放开鼠标后,会自动弹出配置连接对话框,这里我们选择pushButton的clicked()点击信号和LoginDlg的accept()接收槽并按下确定按钮。操作如下:

10.PNG

设置好信号和槽的关联后,操作如下:

11.PNG

小嗷这里简单介绍一下信号和槽:(具体请看第44篇

大伙可以把它们都看做是函数,比如这里,当点击按钮以后就会发射点击信号,即clicked();然后对话框接收到该信号就会执行相应的操作,即执行accept()槽。通常情况下,我们只需要修改槽函数。不过,这里的accept()已经实现了默认的功能,accept()槽的触发会将对话框自动关闭并返回QDialog::Accepted标识,所以我们要使用返回信号QDialog::Accepted标识来判定是否按下了登录按键。

完成后,可以按下图标或者通过F3快键键来返回控件界面编辑模式。

四、自定义的对话框类

1.按下“Ctrl+2”快键键返回代码编辑模式,在这里打开main.cpp文件,添加代码:(当然大家用多了就会记住)

#include "mainwindow.h"
#include <QApplication>
#include "logindlg.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    LoginDlg dlg;                        // 建立自己新建的LoginDlg类的实例dlg
    if(dlg.exec() == QDialog::Accepted) // 利用Accepted返回值判断按钮是否被按下
    {
        w.show();                      // 如果被按下,显示主窗口
        return a.exec();              // 程序一直执行,直到主窗口关闭
    }
    else return 0;          //如果没有被按下,则不会进入主窗口,整个程序结束运行
}

我们先创建了LoginDlg类的对象dlg,在if语句中让dlg运行,执行exec()函数,这样会显示对话框窗口,然后判断exec()的返回值是否是Accepted,假如用户按下了登录按钮,那么返回值应该是Accepted,这时就显示主界面,并正常执行程序;如果没有按下登录按钮,就结束程序。

当然,当点击按钮就会触发登录界面的关闭,主界面的打开。

现在大家可以运行程序,测试一下效果。

2.上面写了一种登录的简单情况(还有注册,管理和用户模式等等),下面再来写另一种情形。打开mainwindow.ui文件进入设计模式,在“按钮”部件上右击并且选择转到槽菜单,如下图所示。

在弹出的转到槽的对话框中选定clicked()信号并按下确定键。这里,会自动跳转到编辑模式mainwindow.cpp文件的on_pushButton_clicked()函数,这个就是自动生成的槽(也是生成槽其中一种方式),已经自动在mainwindow.h文件中进行了声明。只需更改函数体内容。这里更改为:

void MainWindow::on_pushButton_clicked()
{
   QDialog *dlg = new QDialog(this);
   dlg->show();  
}

小嗷创建了一个对话框对象,然后让其显示,创建时指定的this参数表明这个对话框界面的父类窗口就是MainWindow。注意还需在mainwindow.cpp文件的开头添加#include 头文件包含。有的人可能疑问?如果连续按下按钮多次,则会生成N个对话框,是否可能造成内存泄露或者内存耗尽,卡死状态呢?这里简单说一下,Qt的对象树机制保证了不会造成内存泄露危险,而且不用写想C++中写delete语句,因为指明了对话框的父部件(MainWindow),所以当主界面MainWindow销毁时会自动销毁创建的对话框。当然,比较严谨的人也可以在mainwindow.h文件中先定义一个对话框对象,并通过构造函数中进行创建,然后再到这里使用。最后大家可以运行一下程序,查看最终的结果。

13.PNG

感言.png

你们会发现小嗷的opencv长篇大论动不动破2-3万字,而QT也就4k-5k字。理由很简单:

第一,QT文章只是某个知识点(如果一个小项目百分百破万字)

第二,OpenCV你不懂原理,你copy源码都不知道怎么改。OpenCV原理占的小嗷文章的绝大部分,再怎么说,理清原理,你用C++写也好,java写也好,Py实现也好,小嗷相信你们还是对自己有信心。

哦,还有如果愿意就帮小嗷推荐一下公众号,顺手推荐不强求。

如果不嫌麻烦,支付宝首页搜索527768251,领每日红包

相关文章

44.Qt 定义信号 signals 和 槽 slots 详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt5(一)编写Qt多窗口程序 的相关文章

  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • 如何在不同的QT线程中创建一个窗口?

    我有一个应用程序 其中每个线程 主线程除外 都需要创建自己的窗口 我尝试创建一个线程然后调用this gt exec in the run功能 然而 在我接到那个电话之前我就收到了一个错误 ASSERT failure in QWidget
  • 在 Windows 上从源代码构建 PhantomJS-2

    我正在尝试基于这些在 Windows 8 1 x64 上从源代码构建 PhantomJS 2 的开发版本指示 https github com ariya phantomjs wiki PhantomJS 2 但是我收到以下错误 mingw
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • 为什么anchors.centerIn不适用于Column元素?

    我有这段 QML 代码 Column spacing units gu 2 anchors fill parent centerIn parent Row spacing units gu 4 Row spacing units gu 4
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • Qt:关闭模式对话框关闭程序

    在我的 Qt 程序中 我有 2 个窗口 主窗口和子窗口 在程序中 一次仅显示这些窗口之一 主窗口有一个插槽 用于创建模式对话框 现在 假设子窗口中单击按钮的信号被发送到该插槽 在这种情况下 主窗口隐藏 子窗口可见 对话框显示得很好 但是当对
  • 如何阻止 Qt Creator 将可执行文件放置在“调试”子目录中?

    我正在 Qt Creator 中构建一个项目 虽然我不关心中间 obj 文件去哪里 但重要的是最终的可执行文件应放入 并运行 许多依赖项 DLL 等所在的特定目录中 被发现 因此 在 Qt Creator 中 我选择 Shadow Buil
  • Qt ObjectName() 必须是唯一的吗?

    如标题所示的简单问题 如果我打电话setObjectName 在一个对象上 它是否必须是唯一的 或者只是因为约定而推荐 我已经子类化了QLabel 并希望自动为创建的对象命名 如果这是一个坏主意 我会找到一些设置随机唯一名称的方法 我实际上
  • 在 Qt 中用像素图画笔画一条线?

    一段时间以来 我正在使用 Qt C 开发一个简单的绘图和绘画应用程序 目前我正在使用 QPainter drawLine 进行绘制 并且工作正常 我想做的是用像素图画笔绘图 这是我可以做到的 我可以使用 QPainterPath 和 QPa
  • 在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

    我在 Visual Studio 中有很多 Qt 项目 使用新的 Qt MsBuild 格式 https blog qt io blog 2018 02 16 qt visual studio improving performance 由
  • QStandardItemModel::removeRows() 在我的用例中不起作用

    基本上我想删除模型中的所有行 我更喜欢使用removeRows 代替clear 因为我想保留我的标题 我想我错过了一些东西 文档在这里 http doc qt nokia com 4 7 snapshot qstandarditemmode
  • 派生类在 PySide (Qt/PyQt) 中的错误线程中接收信号

    我在让派生类在 PySide 中正确接收信号时遇到问题 我在主 GUI 或命令行应用程序 线程的两个单独线程上使用发送器和接收器 线程是 QThread 对象 发送器和接收器在创建后立即使用 QObject moveToThread 移动到
  • C++:头文件中全局函数的多重定义错误

    该函数是全局的 在头文件中定义 暂时地我想把它留在那里 头文件还构成一个具有内联函数的特定类 其中一个函数调用this全局函数 源文件不包含任何有问题的全局函数 有关错误原因的任何提示吗 如果有人感兴趣的话我可以发布代码 mainwindo
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 另一个宏中的 Q_PROPERTY 宏

    如何放置Q PROPERTY另一个宏里面 辅助宏 define SimpleAllinOne member type public void Set member type arg member m member arg member ty

随机推荐

  • 去除li前面小点点

    li list style type none
  • 3. 性能测试之目标评估

    文章目录 前言 一 模型1 根据日活计算目标QPS 1 原则 2 事例 二 模型2 根据压测数据评估最大支撑并发 1 原则 2 事例 3 备注 三 模型3 根据压测数据评估服务器资源 1 策略 2 备注 四 模型4 评估用户并发或峰值并发
  • Excel·VBA螺旋数组函数

    目录 1 由外到内顺时针的螺旋数组 实现方法1 代码思路 螺旋数组函数代码 举例 实现方法2 代码思路 螺旋数组函数代码 2 由外到内逆时针的螺旋数组 举例 数字1 12从左上角顺时针依次输出的即为螺旋数组 如下图 1 由外到内顺时针的螺旋
  • 网络编程3——TCP Socket实现的客户端服务器通信完整代码(详细注释帮你快速理解)

    文章目录 前言 一 理论准备 Socket套接字是什么 TCP协议的特点 二 TCP 流套接字提供的API ServerSocket API Socket API 三 代码实现请求响应式 客户端服务器 服务器 客户端 疑惑解答 为什么服务器
  • 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识 所以希望能够得到一个稳定可靠并且唯一的识别码 虽然Android系统中提供了这样设备识别码 但是由于Android系统版本 厂商定制系统中的Bug等限制 稳定性和唯一性并不理想 而通过其他硬件信息标识也因为
  • Simulink代码生成(二)——代码生成时模型的配置方法及操作流程

    Simulink代码生成 二 代码生成时模型的配置方法及操作流程 文章目录 Simulink代码生成 二 代码生成时模型的配置方法及操作流程 一 模型 二 代码生成设置 1 步长选择 2 系统目标文件设置 3 生成代码打开测试报告 4 保存
  • 为什么如今这么多人讨论网络安全?

    网络安全如今备受讨论 跟各种经济政治的关系是分不开的 并且变得更加复杂多变 网络安全的发展前景更可观 很多安全企业也开始积极寻求各类网络风险的防范方案和数据隐私保护技术 当今世界形势的变化 以及各种因素的不断影响 全球网络安全问题再不断提升
  • Qt扫盲-QSS概述

    QSS概述 一 概述 二 详细 一 概述 QSS 其实是Qt样式表 Qt样式表是Qt界面的一种强大的机制 除了通过继承QStyle已经可以实现的功能外 它还允许您自定义窗口组件的外观 Qt样式表的概念 术语和语法很大程度上受到HTML层叠样
  • sql server 提取汉字、数字和字母的sql server方法

    sql server 提取汉字 数字 字母的方法 提取数字 if object id dbo get number2 is not null drop function dbo get number2 go create function
  • QT学习(五)——从子窗口传来多个信号(带参数的自定义信号)

    同样是两个窗口 主窗口与副窗口 给副窗口自定义两个重载的信号 传给主窗口处理 void mySignals 信号可以重载 void mySignals int QString 由被关联的按钮发送消息 并送出两条消息给主窗口 emit myS
  • 常用C语言文件操作

    1 fopen 使用fopen需要引用头文件stdio h 函数声明如下 FILE fopen const char pathname const char mode 这里要多多关心的是第二个参数mode 关系到我们对文件操作的权限 这里做
  • 提升KNN的运行效率

    20221005 引言 KNN算法是一种 懒惰 算法 在模型训练过程 仅仅是将数据存储到快速查询的数据结构中 在测试阶段会通过进行距离计算来输出结果 那么当数据集比较大的时候 一方面内存要求会提升 另一方面在计算的时间也会增大 之前的时候
  • vue实现文字水印效果

    vue文件代码
  • Java自学路线(超全超详细)—初学者零基础版Ⅰ

    Java 对于第一次见到它的人来说 不知道它是什么东西 可能看起来是个单词 可是通过网络翻译却没办法给它一个中文定义 但是 在计算机领域中 它是一门面向对象的编程语言 那么问题来了 有人对于 面向对象的编程语言 这个词组并不理解 在此 作出
  • 出现'MySQL Daemon failed to start‘解决方法

    方法千万条 备份第一条 运行 service mysqld start 重启数据库总是会出现如下提示 MySQL Daemon failed to start Starting mysqld FAILED 的提示 如果直接输入 mysql
  • Ubuntu/linux c开发(6)内存泄露

    写好个服务程序 短期测试没啥问题 准备跑长时间的 结果 前两天正常 第三天突然涨了100多M 这感觉 爽飞了 这里说下Ubuntu中内存泄露检测工具 Valgrind 安装和使用连接如下 链接 Valgrind安装使用 这里大概说下统计结果
  • 神经网络量化

    前言 神经网络在图像 语音识别等领域使用越来越广泛 大部分实时性要求不高的服务都可以部署在云上 然而还是有不少模型需要在计算能力有限的可移动设备上快速运行 如人脸解锁 拍照视频的实时处理等 一般训练的模型采用的都是32位浮点数 考虑到大部分
  • 第四讲 赋予网页样式

    文科编程系列课程 Web开发 第四讲 赋予网页样式 目录 引言 1 大小 1 1 长度单位 1 1 1 px 像素 1 1 2 百分比 1 2 宽高 1 1 1 宽度 1 1 2 高度 1 1 3 边框 2 颜色 2 1 颜色的三种表示形式
  • 毕业设计:自主开发的害虫识别系统--文档附源码

    基于yolov5多目标检测算法的农业害虫识别查询系统 设计文档 目标问题与意义价值 研究意义 本项目能够及时准确地识别农业害虫的种类 是害虫准确测报和合理防治的前提 传统的害虫识别方法主要依赖个人的专业经验进行辨别 或参考书本 网络上的文字
  • Qt5(一)编写Qt多窗口程序

    本文作者 小嗷 微信公众号 aoxiaoji 吹比QQ群 736854977 链接 https f600lt github io archives 摘要 这篇开始将从基础知识点开始一步一步QT到QT项目 原因就是读者说 QT类很多看不懂 这