热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

qt创建第二个ui_Qt快速上手2——创建GUI程序

在上一章中我们创建了一个GUI界面的程序,现在来回顾一下我们创建的是QtWidgetsApplication类型的工程基本的类信息是QMainWindow类型

在上一章中我们创建了一个GUI界面的程序,现在来回顾一下

我们创建的是Qt Widgets Application类型的工程

基本的类信息是QMainWindow类型,这个类型包含了菜单栏工具栏和状态栏等典型窗口的特征部件。

这里可选的基类还有QDialog类型,包含了对话框的一些特征。

还可以选QWidget类型,实际上上面两个QMainWindow和QDialog都是继承自QWidget的,因此比QWidget具有更多个性化的特征。如果使用QWidget作为基类,我们可扩展的地方也更多。

创建好后的代码文件是这样的

自动生成的代码

创建工程后Qt自动生成了5个文件。

y1.pro

y1.pro是Qt的工程文件,内容如下:

#-------------------------------------------------

#

# Project created by QtCreator 2015-07-19T09:03:43

#

#-------------------------------------------------

QT += core gui #使用core和gui库 其实这个也是Qt的默认设置 可以省略

#如果需要使用其他的库,例如使用数据库应该加上 QT   +=sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #这是针对Qt5的变化,Qt5的application是在QtWidgets中的,因此要包含这个库

TARGET = y1 #目标程序文件名

TEMPLATE = app #针对不同的类型生成不同的makefile app表示就是普通的应用程序

#工程中包含的源文件

SOURCES += main.cpp\

mainwindow.cpp

#工程中包含的头文件

HEADERS += mainwindow.h

#工程中包含的.ui设计文件

FORMS += mainwindow.ui

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#-------------------------------------------------

#

# Project created by QtCreator 2015-07-19T09:03:43

#

#-------------------------------------------------

QT+=coregui#使用core和gui库 其实这个也是Qt的默认设置 可以省略

#如果需要使用其他的库,例如使用数据库应该加上 QT   +=sql

greaterThan(QT_MAJOR_VERSION,4):QT+=widgets#这是针对Qt5的变化,Qt5的application是在QtWidgets中的,因此要包含这个库

TARGET=y1#目标程序文件名

TEMPLATE=app#针对不同的类型生成不同的makefile  app表示就是普通的应用程序

#工程中包含的源文件

SOURCES+=main.cpp\

mainwindow.cpp

#工程中包含的头文件

HEADERS+=mainwindow.h

#工程中包含的.ui设计文件

FORMS+=mainwindow.ui

如果在Qt Creator中新建源文件,它的名字会自动加入pro文件中。

前面说过,编译的时候Qt使用qmake读取pro文件生成标准的makefile,就是根据pro中的这些信息。

main.cpp

main.cpp的内容很少

#include "mainwindow.h"

#include

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MainWindow w;

w.show();

return a.exec();

}

1

2

3

4

5

6

7

8

9

10

11

#include "mainwindow.h"

#include

intmain(intargc,char*argv[])

{

QApplicationa(argc,argv);

MainWindoww;

w.show();

returna.exec();

}

和上一章的QCoreApplication相比,这里包含的是QApplication ,这两个一个是命令行,一个是图形界面。

和QCoreApplication类似,还是先实例化一个对象a,处理命令行参数,最后也是通过a.exec()进入主循环。所有的QtGUI都会包含这两句代码。

这个主循环是非常重要的,这个是图形界面和普通命令行程序的区别。

在普通的命令行程序中,代码是依次执行的,执行到最后会自动关闭;但在图形界面中,由于我们并不知道接下来用户会执行什么动作,不知道要点击哪个按钮,发出什么命令,所以只好一直等待,这也就是主循环的主要任务。图形界面也会一直显示,除非用户点击关闭。

第7、8行,实例化了一个MainWindow对象w,然后执行show()函数,意思是把w显示出来。

MainWindow是一个class,它的代码就在mainwindow.h和mainwindow.cpp中

mainwindow.h和mainwindow.cpp

这两个文件就是MainWindow类的代码了,.h包含类的声明,.cpp包含类的实现

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private:

Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

namespaceUi{

classMainWindow;

}

classMainWindow:publicQMainWindow

{

Q_OBJECT

public:

explicitMainWindow(QWidget*parent=0);

~MainWindow();

private:

Ui::MainWindow*ui;

};

#endif // MAINWINDOW_H

最开始定义名称空间Ui ,里面有一个类MainWindow ,这个和这个文件里的MainWindow不是一个东西。实际上,这个文件里的MainWindow类有一个成员就是指向Ui::MainWindow的指针。这都是为了使用.ui文件设计界面的。

MainWindow的声明中第一行是Q_OBJECT,这是一个宏,由Qt进行处理,这也是Qt针对c++扩展的地方,所有用到信号的类都要加这个宏。

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

}

MainWindow::~MainWindow()

{

delete ui;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget*parent):

QMainWindow(parent),

ui(newUi::MainWindow)

{

ui->setupUi(this);

}

MainWindow::~MainWindow()

{

deleteui;

}

MainWindow的实现类中,第二行include了一个文件ui_mainwindow.h 这个文件是Qt根据.ui文件自动生成的。编译后可以在debug的目录找到这个文件。

这里相关代码都是和.ui相关的。构造函数中,new一个Ui中的MainWindow ,析构函数delete掉。

mainwindow.ui

这就是界面设计文件了,实际上是一个xml类型的文件,双击后可以跳转到设计界面。

设计界面

窗口

设计界面左边就是各种各样的控件,上面是过滤器,用来快速定位需要的控件,例如输入button可以搜索按钮相关的控件。

中间上方就是我们的窗口程序了;中间下方是事件和信号槽编辑区域。

最右边上方是使用到的对象,下面是属性面板,点击不同的控件可以编辑该控件对应的属性。

我们拖动左边的Push Button到界面中

这时候右边的对象和属性面板都会改变

在对象面板可以看到当前界面中已有的对象。

下面的属性面板也相应变成了QPushButton的属性

编译运行就可以看到效果

目前这个按钮按下没有任何作用。

信号和槽

我们想让按钮有点作用

点击设计界面上方的四个按钮的第二个进入信号和槽编辑模式。(默认是第一个的控件编辑模式)

然后把鼠标经过相应控件的时候会显示红色。左键按下并拖动,可以连接相应的信号槽。

通过这个操作我们就把按钮的clicked()和MainWindow的close()联系起来了。

左边窗口选择的clicked()是信号,当我们点击按钮的时候按钮就会发出clicked()的信号。

右边是槽函数,也就是说,当clicked信号发出的时候,就会执行槽函数。其实槽函数就是函数,只不过该函数会在收到信号时自动调用。

这里可以选择的函数都是对象内部自带的,我们也可以使用自定义的函数。

运行一下就可以发现,现在点击按钮就可以关闭窗口了

用代码来控制控件

点击四个按钮的第一个回到控件编辑界面

点击PushButton后,可以用属性面板修改控件属性

在属性面板我们还可以看到该控件的名字,利用名字可以用c++代码进行控制

回到编辑模式,修改MainWindow的构造函数

使用ui指针就可以找到设计界面对象窗口中的所有对象,调用对象的成员函数就可以进行控制了

运行一下就可以看到按钮显示的文本果然变成了NIHAO

Qt帮助

Qt的帮助也集成到了Qt Creator中,只要按下F1键,就可以打开光标所在处对应的帮助文件。如果光标在的地方是变量,也会打开该变量所属类型的帮助。



推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
手机用户2602906305_849
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有