1,QtCreator的快捷键
- 在.h文件中按F4立马切换到.cpp文件中
- 在头文件上按F1即可查看使用该头文件所需的模块
2,Qt中简单程序的基本结构
//自定义头文件
#include "mywidget.h"
//应用程序类
//Qt头文件没有.h
//头文件名和类型一样
#include <QApplication>
int main(int argc, char *argv[])
{
//有且只有一个应用程序类的对象
QApplication a(argc, argv);
//窗口类的子类,w为子类对象
MyWidget w;
//窗口默认是隐藏的,需要人为显示
w.show();
//a.exec()函数的存在作用是,让程序一直运行,等待用户操作
return a.exec();
}
3,项目文件的结构
#模块
QT += core gui
#高于4版本,添加 QT += widgets,为了兼容Qt4
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
#应用程序的名字
TARGET = hello
#指定makefile的类型
TEMPLATE = app
#源文件
SOURCES += main.cpp\
mywidget.cpp
#头文件
HEADERS += mywidget.h
4,Qt基本语法
- 指定父对象:如果不指定父对象,对象和对象(窗口和窗口)没有关系,独立。a指定b为它的父对象,a放在b的上面。指定父对象后只需要显示父对象即可,子对象自动显示。方式有两种:其一,setParent。b.setParent(&a)其二,通过构造函数传参QPushButton b1(&a)。
- 标准信号和槽。connect(&b1, &QPushButton::pressed, this, &MainWidget::close);相当于模拟的中断
&b1: 信号发出者,指针类型
&QPushButton::pressed 处理的信号。 &发送者的类型::信号名字
this:信号的接受者
&MainWidget::close: 槽函数,信号的处理函数 &接收的类名::槽函数名字
- 自定义槽函数
Qt5:任意的成员函数,普通全局函数,静态函数都可以作为槽函数
槽函数需要和信号一致(参数,返回值)
信号都是没有返回值的,所以槽函数一定是没有返回值的。
- 自定义信号
信号没有返回值,但可以有参数;信号就是函数的声明,只需要声明,无需定义;使用方法emit 信号函数名,可以发送信号名,然后可以在主窗口中接收信号并且执行槽函数;
有参数的信号: 一样是只需要声明,不需要实现。
当信号带参数时,在connect函数里,第二个参数可以这样写:void (SubWidget::*funSignal)(int,QString) = &SubWidget::mySignal;然后把funSignal当做实参传给connect。注意,声明时要加上SubWidget::表示后面的信号的作用域是属于这个窗口的。
- Lambda表达式
C++11新增加的特性,在QT中配合信号使用,非常方便;
使用Lambda表达式时,需要在项目文件中添加一行,CONFIG += C++11
语法: [](参数列表){表达式体},[]的作用是把外部变量传进来。当中括号内是=时,是把外部所有局部变量、类中所有成员以值传递的方式传进Lambda表达式,但是是只读的;当中括号内是this时,类中所有成员以值传递方式;当中括号内是&时,把外部所有局部变量用引用方式传递进表达式,虽然效率高,但是不安全,推荐使用=。()中的参数是和信号中的参数一样的。这种方式是很方便的。
connect(&b1, &QPushButton::pressed,
[=](){} );
- 坐标系统
父窗口是相对于屏幕的而言的,原点在屏幕的左上角,坐标从左到右递增,从上向下递增。
子窗口是相对于父窗口而言的,原点在父窗口的左上角,坐标从左到右递增,从上向下递增。
- 内存回收机制
指定父对象后,同时子对象是直接或者间接继承于QObject时,子对象如果是动态分配空间的(使用new),不需要手动delete,因为系统会自动释放。
- 菜单栏和工具栏等控件的使用
基类是QMainWindow时,是有带菜单栏的窗口。
#include "mainwindow.h"
#include<QMenuBar>//菜单栏基类
#include<QMenu>//菜单基类
#include<QDebug>
#include<QToolBar>//工具栏基类
#include<QStatusBar>//状态栏基类
#include<QLabel>
#include<QTextEdit>//文本编辑器基类
#include<QDockWidget>//浮动窗口
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//菜单栏
QMenuBar *mBar = new QMenuBar(this);
//添加菜单
QMenu *pFile = mBar -> addMenu("文件");
//添加菜单项,添加动作
QAction *pNew = pFile -> addAction("新建");
connect(pNew, &QAction::triggered,
[=](){
qDebug() << "新建被按下";
}
);
pFile -> addSeparator(); //添加分割线
QAction *pOpen = pFile -> addAction("打开");
//工具栏,菜单项的快捷方式
QToolBar *toolBar = addToolBar("toolBar");
//工具栏添加快捷键,也可以在工具栏中添加按钮
toolBar -> addAction(pNew);
//状态栏
QStatusBar *sBar = statusBar();
QLabel *label = new QLabel(this);
label -> setText("Normal text file");
sBar -> addWidget(label);
//addWidget是从左向右依次添加
sBar -> addWidget(new QLabel("2", this));
//从右向左添加
sBar -> addPermanentWidget(new QLabel("3", this));
//核心控件
QTextEdit *textEdit = new QTextEdit(this);
setCentralWidget(textEdit);//把这个控件设置成核心控件
//浮动窗口
QDockWidget *dock = new QDockWidget(this);
addDockWidget(Qt::RightDockWidgetArea, dock);//第一个参数表示放的位置
}
- 模态和非模态的对话框
模态对话框是指只能在当前对话框进行操作,模态对话框存在的时候不能切换到其他的对话框操作。
非模态对话框是指在对当前对话框操作的时候可以切换到其他的对话框操作的对话框。
常用的方法可以使用 p->setAttribute();的方法设置属性,其中p为对话框的对象。