Qt5(一)编写Qt多窗口程序
本文作者:小嗷
微信公众号: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(当然选择其他都是可以),如下图所示。
3.单击下一步进入类信息界面,将类名更改为LoginDlg(注意类名首字母一般大写,而对象名为小写开头)。如下图所示,相关文件会自动改名。
4.当完成后会自动跳转到设计模式,可以对新添加的对话框进行设计。小嗷向界面上拖入一个Push Button按钮,然后更改文本为“XXX”。为了实现点击按钮后可以自动关闭对话框并显示另外窗口,我们要设置信号和槽。点击设计模式上方的一个小便签 图标,或者直接按F4,便进入了设计界面的信号和槽编辑模式。按着鼠标左键,从按钮上拖向界面,操作如下:
当小嗷放开鼠标后,会自动弹出配置连接对话框,这里我们选择pushButton的clicked()点击信号和LoginDlg的accept()接收槽并按下确定按钮。操作如下:
设置好信号和槽的关联后,操作如下:
小嗷这里简单介绍一下信号和槽:(具体请看第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文件中先定义一个对话框对象,并通过构造函数中进行创建,然后再到这里使用。最后大家可以运行一下程序,查看最终的结果。
你们会发现小嗷的opencv长篇大论动不动破2-3万字,而QT也就4k-5k字。理由很简单:
第一,QT文章只是某个知识点(如果一个小项目百分百破万字)
第二,OpenCV你不懂原理,你copy源码都不知道怎么改。OpenCV原理占的小嗷文章的绝大部分,再怎么说,理清原理,你用C++写也好,java写也好,Py实现也好,小嗷相信你们还是对自己有信心。
哦,还有如果愿意就帮小嗷推荐一下公众号,顺手推荐不强求。
如果不嫌麻烦,支付宝首页搜索527768251,领每日红包
相关文章
上一篇: QTday3
下一篇: 应用移植 (二) QT编程