Qt界面编程01
1、什么是Qt
Qt是跨平台 C++图形用户界面应用程序开发框架。主要用于开发GUI程序,它是面向对象的框架,使用C++语言封装的一些类库。
包:提供原码,供程序使用的现有代码,里面只提供一些简单功能、算法。
库:只提供一些头文件,源码已经被编译成二进制的xxx.so、xxx.a的文件,针对某类的功能提供了一套可供程序调用的函数、类。
框架:几乎所有的需要、功能,它都自己一整套的解决方案。
2、Qt的集成开发环境
1、Qt助手:Qt的帮助手册,里面包含了Qt中所有的类的说明使用方法。
2、Qt设计师:类似一个画图工具,可以通过画图的方式进行设计界面,它设计出的文件叫xxx.ui文件,可以使用uic 工具把它翻译成 xxx.h头文件,头文件中有关于界面的类。
3、Qt文本编辑器:主要用于编写代码工具。
4、Qt构建器:它负责把资源文件、界面文件、头文件、源文件组织在一起,生成编译脚本。
5、Qt调试器:它负责追踪Qt程序的执行过程,并且在程序执行过程去对程序进行调试。
3、Qt的HelloWorld
#include <QApplication> #include <QLabel> int main(int argc,char* argv[]) { QApplication app(argc,argv); QLabel lab("Hello,Qt!"); lab.show(); app.exec(); return 0; }
1、对代码的介绍
1、Qt的类名就是类的头文件名字
2、QApplication类对象负责给Qt界面程序构建一个运行环境。
3、QLabel是Qt中负责显示文字的控件,Qt中的所有控件默认都是隐藏的,需要调用show()成员函数来显示它们。
4、QApplication类对象的exec成员调用时,Qt程序才真正运行起来,加载界面。
2、构建、编译项目
1、构建项目脚本,qmake -project 命令 构建项目,该命令会根据当前目录的内容,自动生项目脚本,xxx.pro,如果想编译带界面的程序,需要在xxx.pro脚本中添加 QT += widgets 。
2、生成编译脚本,qmake 命令它会根据xxx.pro脚本中的内容自动生成Makefile编译脚本。
3、执行make命令,编译出可执行程序。
3、集成开发环境的使用介绍
1、使用集成开发环境编写Hello
1、打开qtcreator集成开发环境
2、文件->新建文件或项目->Application->Qt Widgets Application
3、输入项目名称,选择项目位置(不要有中文)
4、选择 编译方案 (最终编译出的程序在什么设备上执行)
5、设置主界面类名、源文件名、头文件名、界面文件名,一般都取同一个名字
6、Ctrl+R编译运行程序
2、常用的设置
1、显示、隐藏侧边栏,Alt+0
2、分栏进行拆分侧边栏,可选择项目,打开文档、类视图、大纲、文件系统。
3、编辑界面,前进、后退,选择要编辑的文件,选择符号,分栏,左右拆分、上下拆分。
4、工具->选项->文档编辑器,字体、字号、配色、缩进、代码风格。
3、常用的快捷键
1、选中一个类,F1 打开该类的帮助手册
2、选中一个对象,F2可以在声明与定义之间切换
3、F4,源文件与头文件之间切换
4、Ctrl+B,编译项目,检查代码是否有语法错误
5、Ctrl+F,查找或替换
6、Ctrl+i,格式化代码
7、Ctrl+/,注释、取消注释
8、Ctrl+L,跳转到指定的行
9、Ctrl+Tab,切换已经打开过的文件
10、Ctrl+滚轮,放大缩小代码
11、Ctrl+Shift+Up/Down,代码向下或向下移动
12、Ctrl+Shift+<>,折叠、取消折叠
13、Ctrl+单击,跳转到定义位置
14、Ctrl+Shift+R,批量修改变量名
15、Ctrl+Shift+S,保存所有文件
4、Qt帮助手册介绍
1、Header:该类需要包含的头文件
2、qmake:需要在xxx.pro 添加什么配置
3、Inherits:该类继承自那个类
4、Properties:具有protected访问属性的成员变量,父类、爷爷类中的protected访问属性的成员变量
5、Public Functions:具有public访问属性的成员函数,以及继承来的成员函数。
6、Public Slots:具有public访问属性的槽函数(可以与信号绑定的函数),以及继承来的槽函数。
7、Signals:该可以发出的信号,这类信号由Qt自己设计、维护,信号和槽机制是Qt最重要的特点。
8、Reimplemented Protected Functions:具有protected访问属性,可以被覆盖的虚函数,使用这种函数时,要搞明白,发生什么事件时,这些函数会被调用。
9、Additional Inherited Members:继承的成员的汇总。
10、Static Public Members:具有public访问属性的静态成员。
11、Macros:与该类相关的宏。
12、Detailed Description:对该类的详细介绍,示例代码。
5、Qt的窗口容器
在Qt中每个控件都可以是一个单独窗口,如果实现一个完善的窗口界面,就需要把若干个控件放置在一个窗口中,这种窗口叫做窗口容器。
1、QWidget
它是所以控件、窗口的基类,可以被嵌套(可以被当作子窗口),单独使用时有边框,被嵌套时没有边框,是一种比较干净的窗口容器。
2、QDialog
它继承了QWidget,具有对话功能的窗口,所有具有对话功能的控件都继承自它,比如提示类的弹窗,它可以获得用户的"选择"的结果,一般不它作为主窗口。
3、QMainWindow
它继承了QWidget,并且里面还默认嵌套了QWidget类对象,并且还包含了菜单栏、工具栏、状态栏,QMainWindow不能被嵌套,一般作为程序的主窗口。
4、如何把控件放置到窗口容器中
#include <QApplication> #include <QMainWindow> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建窗口容器对象 QMainWindow* mw = new QMainWindow; // 告诉控件谁是它父窗口 QLabel lab1("Hello",mw); QLabel lab2("World",mw); // 窗口容器执行show里面的所有控件就都显示了 mw->show(); return a.exec(); }
注意:当控件放置到了窗口容器中,控件就不挨个show()了,只需要窗口容器show(),它里面的所有控件会全部显示。
5、控件、窗口的常用成员函数
Qt中使用直角坐标系的第四象限来对控件的位置进行布局,控件默认的显示位置是(0,0),可以使用move函数调用控件的位置,就是控件的左上角的点。
void move(int x, int y); void move(const QPoint &); 功能:设置控件的位置 void resize(int w, int h); void resize(const QSize &); 功能:设置控件的大小 void setGeometry(int x, int y, int w, int h); void setGeometry(const QRect &); 功能:设置控件的位置和大小 int x() const; 功能:获取控件在窗口的x轴坐标 int y() const; 功能:获取控件在窗口的y轴坐标 QPoint pos() const; 功能:获取控件在窗口的x、y坐标 int width() const; 功能:获取控件的宽度 int height() const; 功能:获取控件的高度 QSize size() const; 功能:获取控件的高度和宽度 QRect rect() const; 功能:获取控件的位置和大小 const QFont &font() const; 功能:获取该控件所显示的文件的字体 void setFont(const QFont &); 功能:设置该控件所显示的文件的字体 void show(); 功能:显示控件 void hide(); 功能:隐藏控件 void setText(const QString &); 功能:设置控件上要显示的文字 QString text() const; 功能:获取控件上的文字 void clear(); 功能:清除控件上显示的内容
6、Qt中的字符串和输出调试、容器
1、Qt中封装了QString字符串类,它包含C++中string类的所有功能,并且它还有一系列的toXXX函数,注意:我们从界面上获取到的所有数据都是QString类型的字符串。
2、Qt中输出调试信息可以使用方法有:
1、printf/cout还可以继续使用,需要加头文件和名字空间,如果不是在终端运行,它们输出的数据不会立即显示在集成开发环境,而是等程序结束才显示出来。
2、qDebug函数,它既可以像printf一样使用,也可以像cont一样使用(需要加头文件)。
#include <QDebug> ... qDebug("\n%s\n",lab1.text().toStdString().c_str()); qDebug() << lab1.text();
3、Qt中继承并扩展了STL模板库中的容器
#include <QVector> #include <QList> #include <QMap> #include <QStack> #include <QQueue> #include <QSet>
7、信号和槽机制
1、当Qt的程序执行后,默认只有一个进程,进程中只有一个线程,该线程主要负责监听、用户的鼠标、键盘等操作,无法去执行其它的代码,与C、C++的终端程序顺序流程不同。
2、当用户点击了鼠标、敲击了键盘,Qt的控件就是发出一些信号,这些信号可以预先绑定一些函数,当发射信号后,Qt会自动调用绑定的函数。
3、Qt把可以与信号绑定的类成员函数叫作槽函数,可以被手动调用像普通函数一样执行,也可以与信号绑定。
4、信号与槽函数绑定的方法:
QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method) 注意:QObject是所有Qt类的基类,connect函数是QObject的静态成员函数。 sender:信号的发出者,必须是继承了QObject的子类 signal:发出的信号,必须是sender成员 receiver:信号的接收者,必须是继承了QObject的子类 method:要执行的槽函数,必须是receiver的成员 SIGNAL()宏函数,它负责信号转换成字符串 SLOT()宏函数,它负责把槽函数转换成字符串 注意:在connect时候不要手动填写信号和槽函数,因为编译器根本不会检查你写的是否正确,因为connect函数要的是信号槽函数的字符串,所以尽量使用工具的自动提示功能。
#include <QApplication> #include <QPushButton> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QPushButton btn("我是个按钮"); btn.show(); QLabel lab("我是个标签"); lab.show(); QObject::connect(&btn,SIGNAL(clicked()),&lab,SLOT(clear())); return a.exec(); }
8、自定义信号和槽
1、槽函数必须是类成员函数,并且必须继承QObject类或者是QObject的子类。
2、在类的最前面必须有 Q_OBJECT 关键字,如果第一次编译时忘记写了,之后再添加依然会出错,解决方法就是重新构建该项目(把所有自动生成的文件全部删除)。
3、在槽函数前面必须有 public slots: 关键字。
4、像普通成员函数一样去实现槽函数,槽函数内不要执行耗时的操作,因为执行槽函数时,界面是无法操作的。
5、创建类对象,与信号绑定。
6、在signals:关键字后面进行声明信号。
7、使用 emit 信号() 发射信号。