基础框架
#include <QApplication>
//QApplication应用程序类
//Qt头文件没有.h
//头文件和类名一样
int main(int argc, char *argv[])
{
//有且只有一个应用程序类的对象
QApplication a(argc, argv);
//MyWidget继承于QWidget,QWidget是一个窗口基类
//所以MyWidget也是窗口类
//w就是一个窗口
MyWidget w;
//窗口创建默认是隐藏,需要人为显示
w.show();
//让程序一直执行,等待用户操作
//等待事件的发生
return a.exec();
}
项目文件(qmake)
#模块
QT += core gui
#高于4版本,添加QT += widgets,为了兼容Qt4
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
#应用程序的名字
TARGET = mike
#指定makefile的类型,app
TEMPLATE = app
#源文件 .cpp文件
SOURCES += \
main.cpp \
mywidget.cpp
#头文件 .h文件
HEADERS += \
mywidget.h
父对象
如果不指定父对象,对象和对象(窗口和窗口)没有关系,独立
a指定b为它的父对象,a放在b上面
指定父对象,有2种方式:
- setParent
- 通过构造函数传参
指定父对象,只需要父对象显示,上面的子对象自动显示
信号和槽函数
connect(&b1,&QPushButton::pressed,this,&Widget::close);
/*&b1:信号发出者,指针类型
* &QPushButton::pressed:处理的信号,&发送者的类名::信号名字
* this:信号接受者
* &MainWidget::close:槽函数,信号处理函数,&接收的类名::槽函数名字
*/
- 槽函数:可以是任意类型的函数,包括成员函数、普通全局函数、静态函数
- 需要和信号一致(参数、返回值)
- 由于信号没有返回值,所以槽函数一定没有返回值
自定义信号
class subWidget : public QWidget
{
Q_OBJECT
public:
explicit subWidget(QWidget *parent = nullptr);
void sendSignal(){emit mySignal();}
signals:
void mySignal();
/* 信号必须有signals关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit mySignal(),信号可以重载
*/
private:
QPushButton b;
};
重载信号
当同个信号需要不同版本的定义的时候:不同的参数值。因此需要将信号进行重载,在利用时需要利用函数指针处理。
void (subWidget::*funSignal)() = &subWidget::mySignal;
void (subWidget::*testSignal)(int,QString) = &subWidget::mySignal;
connect(&subW,testSignal,this,&Widget::mySlot2);
或者利用Qt4的语法:SIGNAL()和SLOT(),不建议使用
connect(&subW,SIGNAL(mySignal()),this,&Widget::mySlot);
但是该方法利用的是c语言的宏定义,将函数名字转换成字符串,不进行错误检查
lambda表达式和qt
lambda表达式实质上是函数对象,也可以将其理解为未命名内联函数。它具有一个返回类型、一个参数列表和一个函数体。
- 语法规则:
[/*捕获列表*/](/*传入参数*/)
{
/*函数体*/
}
/*[],方括号里存放的是捕获列表,能够捕获lambda定义处作用域内的局部变量、类成员变量
*=:把外部所有变量、类中所有成员以值传递方式
*this:类中所有成员以值传递方式
*&:把外部所有局部变量引用符号
*也可以放进外部变量名,直接捕获
*/
/*(),小括号里可以像普通函数一样传入参数*/
/* 函数体与普通函数实现相同 */
connect(pb2,&QPushButton::pressed,
[=](){
b1.setText("123");//b1是外部变量
});
坐标系统
- 对于父窗口,坐标系统相对于屏幕
- 原点:相对于屏幕左上角(相对于父对象),不包括边框
- x:往右递增
- y:往下递增
Qt内存回收机制
- 指定父对象后,子对象如果是动态分配空间new,不需要手动释放delete,系统会自动释放。主要实现机制是,QT内部利用对象树来释放资源
窗口基础框架
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//菜单栏
QMenuBar *mBar = menuBar();
//添加菜单
QMenu *pFile = mBar->addMenu("文件");
//添加菜单项,添加动作
QAction *pNew = pFile->addAction("新建");
connect(pNew,&QAction::triggered,
[=]()
{
qDebug()<<"新建";
}
);
//工具栏,菜单项的快捷方式
QToolBar *toolBar = addToolBar("toolBar");
//工具栏添加快捷键
toolBar->addAction(pNew);
//状态栏
QStatusBar *sBar = statusBar();
QLabel *label = new QLabel(this);
label->setText("Normal text file");
//addWidget 从左往右添加
sBar->addWidget(label);
//addPermanentWidge 从右往左添加
sBar->addPermanentWidget(new QLabel("3",this));
//核心控件
QTextEdit *textEdit = new QTextEdit(this);
setCentralWidget(textEdit);
//浮动窗口
QDockWidget *dock = new QDockWidget(this);
addDockWidget(Qt::RightDockWidgetArea,dock);
//模态和非模态对话框
QMenu *pDia = mBar->addMenu("对话框");
QAction *pmotai = pDia->addAction("模态对话框");
connect(pmotai,&QAction::triggered,
[=]()
{
QDialog tmp;
tmp.exec();
}
);
QAction *pfeimotai = pDia->addAction("非模态对话框");
connect(pfeimotai,&QAction::triggered,
[=]()
{
QDialog tmp;
tmp.show();
}
);
//标准对话框和文件对话框
}
Qt常用函数
-
include
. qDebug():类似于cout,qDebug()<<… //自动带换行,无需endl
-
include
- str.toUtf8().data():将Qstring转化为utf8编码