在桌面开发中,总的来说,包含两种类型的应用程序:无界面的Console程序和有界面的GUI程序。Qt也不例外,包含Qt Console Application和Qt GUI Application。
一、Qt Console Application
在VS2015中创建一个Qt Console Application,默认会生成一个main.cpp源文件,代码如下,
#include <QtCore/QCoreApplication>
#include <iostream> //自行添加int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//如果要打印Hello Qt,直接采用C++中的cout对象即可std::cout << "Hello Qt" << std::endl;return a.exec(); //开始主线程事件循环
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
解析:在main函数中主要创建了一个QCoreApplication类的对象,然后执行了这个对象的exec操作。
QCoreApplication类继承自QObject,而QObject类是Qt中最基本的类,所有类的基类。
QCoreApplication这个类是整个应用程序的核心,用于程序的初始化,生成事件循环,程序退出等一系列动作。
二、Qt GUI Application
三种主窗体
Qt有三种类型的主窗体:QDialog, QWidget, QMainWindow。
QWidget
QWidget类是所有用户界面对象的基类,其中QDialog和QMainWindow继承自它。
它有以下的特点:- Widget是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己, 最常见的就是控件(按钮、编辑框等);
- 每个Widget都是矩形的,它们按照Z-order进行排序;
QDialog
QDialog类是对话框窗口的基类。一般作为顶级窗口(没有父窗口的窗口称为顶级窗口)与用户交互。
常见的对话框窗口有:文件选择窗口、颜色和字体选择窗口等。QMainWindow
提供一个有中心部件,菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。
锚接部件
1. 锚接部件一般多为一个容器来使用,以包容其他窗口部件来实现功能;
2. 对于一个标准的Qt主窗口而言,锚接部件并不是必须的;
3. 锚接部件可以作为一个窗口浮动在主窗口的上面,也可以像工具栏一样停靠在主窗口的上、下、左、右4个方向;
4. 一个主窗口可以包含多个锚接部件。
中心部件
1. 主窗口的中心,一个主窗口只有一个中心部件。主窗口有自己的布局管理器,因此不能再给主窗口设置布局,但是可以给中心部件设置布局。
创建界面的三种方法
- 手工设计界面
使用手工创建代码时,需要从Qt已有的GUI类库中选择一个类作为基类继承,并且添加必要的其它成员。通常,我们会选择从QDialog、 QWidget、QMainWindow等类中选择一个作为主窗体;然后创建其它的控件,并使用布局管理器布局这些控件;最后将该布局设置为主窗体的布 局。如下面例子所示,
#include <QtWidgets/QApplication>
#include <QtWidgets/QDialog>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QHBoxLayout>class MyDlg : public QDialog
{
public :MyDlg(QWidget* parent = Q_NULLPTR) :QDialog(parent){/** @breif QT5中如何解决中文乱码问题:* 常量:QString::fromLocal8Bit和QStringLiteral* 对于字符串变量,使用QString自带函数*/plabel = new QLabel(QString::fromLocal8Bit("姓名"));pEdit = new QLineEdit;// 使用布局管理器布局控件QHBoxLayout *Layout = new QHBoxLayout;Layout->addWidget(plabel);Layout->addWidget(pEdit);// 设置窗口的布局管理器setLayout(Layout);setWindowTitle(tr("Find"));setFixedHeight(sizeHint().height());}
private:QLabel* plabel;QLineEdit* pEdit;
};
int main(int argc, char *argv[])
{QApplication a(argc, argv);MyDlg mydlg;mydlg.show();return a.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
使用Qt Designer设计界面
采用Qt Designer,使得快速创建对话框成为可能。在Qt Designer环境中,所有的操作都采用可视化的操作,可拖放控件、关联信号与槽、设置特定控件的属性。如下图所示,动态加载UI文件并生成界面
前面的两种方法需要事先创建好相应的文件或代码,然后连同其它文件进行编译,如果后期要修改界面则必须修改代码或UI文件并重新编译。
而不需要重新编译整个程序的方法是采用动态加载UI文件的方式。UI文件采用Qt Designer编辑,然后在程序中调用UI文件,如下面代码所示,
#include "guitest3.h"
#include <iostream>
#include <QtWidgets/QApplication>
#include <QFile>
#include <QtUiTools/QtUiTools>
#include <QString>#pragma comment(lib, "Qt5UiToolsd.lib")
int main(int argc, char *argv[])
{QApplication a(argc, argv);QUiLoader loader;QFile file("./dialog.ui");loader.load(&file)->show();return a.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
QApplication
QApplication 类管理图形用户界面应用程序的控制流和主要设置。 可以说 QApplication是Qt的整个后台管理的命脉,它包含主事件循环,在其中来自窗口系统和其它资源的所有事件被处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。它也处理绝大多数系统范围和应用程序范围的设置。
对于任何一个使用Qt的图形用户界面应用程序,都正好存在一个QApplication对象,而不论这个应用程序在同一时间内是不是有0、1、2或更多个窗口。
三、Qt Widgets、QML、Qt Quick的区别
QT为了进一步的实现界面和逻辑代码的分离,引入了Qt Quick库,可以让用户很方便的配置丰富的应用界面。与传统的Qt Widgets相比,
- Qt Quick用脚本QML及JS,类似于DirectUI;而Qt Widgets用C++,即传统GUI。
- Qt Quick是一种脚本语言(类似于css)。Qt是开发平台,包含了Qt Quick的运行库。Qt和Qt Quick的关系就像 “网页”与“样式表”的关系。
- 如果你的界面使用Qt Gui写的,那么用不了qml,因为qml的主要作用就是用来做画面的。把Qt Gui程序当成一个C++程序来看。如果想显示qml做的画面,在Qt Gui程序中打开qml的画面,而不要打开QWidget那种画面即可。
- QtQuick完成qml脚本到c++的转换(就像网页中的javascript不需要编译,可以直接运行一样)。这样不需要编译,就可以直接改脚本来实现功能,在嵌入式设备里用起来很方便。
详细可以参见“一去丶二三里”的博客:https://blog.csdn.net/liang19890820/article/details/54141552