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多窗口程序 的相关文章

  • 如何搭建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
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • Qml 和模糊图像

    我想使用 QML 实现模糊效果 我找到了有关 效果 模糊 的参考资料 例子 http qt gitorious org lscunha qt components lscunha qt components blobs d78feec567
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • 用 C++/Qt 编写的程序中的 RTF / doc / docx 文本提取

    我正在写一些程序Qt https en wikipedia org wiki Qt 28software 29 C 我需要从中读取文本微软Word https en wikipedia org wiki Microsoft Word RTF
  • QComboBox 下拉项边距

    我想设计我的风格QComboBox为下拉项目留出边距 现在是这样的 我想要这样的东西 我尝试过 QComboBox QAbstractItemView item margin 3px 但它不起作用 你能帮我解决这个问题吗 您想在项目之间设置
  • 在 QtCreator 中使用 .pro 和 .pri 正确(树)显示 Qt 项目

    是否可以使用项目包含文件 pri 显示不止一个额外级别 例如如果 pro文件包括 pri文件包含两个 pri files pro pri pri pri 在 QtCreator 项目 中显示具有误导性 pro pri pri pri 它根本
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • QMutex 是否需要是静态的,以便此类实例的其他线程调用知道暂停其操作?

    从多个线程调用以下附加函数 我不希望数据重写附加 因为计数器尚未增加 除了当前使用 Append 的线程之外 这是否会挂起所有进入的线程 或者其他线程会继续运行而不追加数据吗 互斥锁是否需要是 静态 的 或者每个实例都知道要暂停操作吗 如果
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • QMainWindow 上的 Qt 布局

    我设计了一个QMainWindow with QtCreator s设计师 它由默认的中央小部件 aQWidget 其中包含一个QVBoxLayout以及其中的所有其他小部件 现在我想要的一切就是QVBoxLayout自动占据整个中央小部件
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 针对初学者的 QT 商业许可证与非商业许可证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 QT 许可似乎非常反学习 因为据我所知 用它开发的任何东西都只能是商业的当且仅当 its entire开发是在使用商业许可证的情况下完成的
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m

随机推荐

  • 去除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类很多看不懂 这