热门标签 | 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键,就可以打开光标所在处对应的帮助文件。如果光标在的地方是变量,也会打开该变量所属类型的帮助。



推荐阅读
  • 本文探讨了在使用 ClickOnce 部署方式时遇到的自动更新失败问题,包括本地安装与服务器安装的不同表现,并提供了详细的解决方案。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • J2EE平台集成了多种服务、API和协议,旨在支持基于Web的多层应用开发。本文将详细介绍J2EE平台中的13项关键技术规范,涵盖从数据库连接到事务处理等多个方面。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 这个报错出现在userDao里面,sessionfactory没有注入。解决办法:spring整合Hibernate使用test测试时要把spring.xml和spring-hib ... [详细]
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
  • 深入解析Spring Boot项目的启动机制
    在Java后端开发中,Spring Boot框架以其简洁性和强大的功能受到了广泛欢迎。本文将探讨Spring Boot项目启动的核心——SpringApplication类及其run()方法的工作原理。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • PHP网站部署指南:从零开始搭建PHP网站
    本文提供了详细的步骤指导,帮助开发者在不同环境下成功部署PHP网站,包括在IIS和Apache服务器上的具体操作。 ... [详细]
  • 本文旨在为初学者提供一个详细的指南,从零开始学习如何使用 ASP.NET MVC5 和 Entity Framework 6 (EF6) 搭建项目。通过逐步指导,帮助读者理解 MVC 架构的核心概念,并掌握基本的操作方法。 ... [详细]
  • VS Code 中 .vscode 文件夹配置详解
    本文介绍了 VS Code 中 .vscode 文件夹下的配置文件及其作用,包括常用的预定义变量和三个关键配置文件:launch.json、tasks.json 和 c_cpp_properties.json。 ... [详细]
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
  • 在AngularJS中,有时需要在表单内包含某些控件,但又不希望这些控件导致表单变为脏状态。例如,当用户对表单进行修改后,表单的$dirty属性将变为true,触发保存对话框。然而,对于一些导航或辅助功能控件,我们可能并不希望它们触发这种行为。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
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社区 版权所有