QT简介
是跨平台图形节目的引擎,其优点为跨平台,接口简单,容易上手。
一、创建项目
点击文件,新建文件或项目
、
创建一个桌面Qt应用,包含一个基于Qt设计师的主窗体。
设置名字和路径
构建套件
QWidget是QMainWindow和QDialog的父类,选择QWidget。
版本控制系统选择,团队开发比较重要。比如说svn,vss,git等。
至此,成功创建一个QT项目。
初始项目解读
main.cpp文件中
#include "maingui.h" //导入gui
#include <QApplication> //包含一个应用程序的头文件
int main(int argc, char *argv[])
{
//应用程序对象,在QT中应用程序对象有且仅有一个
QApplication a(argc, argv);
//其父类为QWidget
MainGUI w;
//窗口对象默认不会显示,必须调用show方法显示窗口。
w.show();
//让应用程序进入消息循环,相当于让代码阻塞到这一行,后面代码不执行。
return a.exec();
}
maingui.h中
#ifndef MAINGUI_H
#define MAINGUI_H
#include <QWidget> //包含头文件,QWidget窗口类
namespace Ui {
class MainGUI;
}
class MainGUI : public QWidget //继承自QWidget
{
Q_OBJECT //Q_OBJECT宏,允许类中使用信号和槽的机制
public:
explicit MainGUI(QWidget *parent = nullptr); //构造函数
~MainGUI(); //析构函数
private:
Ui::MainGUI *ui;
};
#endif // MAINGUI_H
二、命名规范以及快捷键
①、类名,首字母大写,单词和单词之间首字母大写
②、函数名,变量名称,手写字母小写,单词和单词之间首字母大写
③、注释
ctrl+/
④、运行
ctrl+r
⑤、字体缩放
ctrl+鼠标滚轮
⑥、查找
ctrl+F
⑦、整行移动
ctrl+shift+↑或↓
⑧、帮助文档
F1
⑨、自动对齐
ctrl+F
⑩、同名之间的.h和.cpp切换
F4
帮助文档在的位置:
Qt\5.9.8\msvc2013_64\bin 的 assistant.exe,打开即可。
三、创建一个按钮
可直接在gui界面拖拽一个button,也可以引入头文件
#include <QPushButton> //按钮控件的头文件
然后进行创建按钮
QPushButton *btn=new QPushButton;
//让btn对象依赖在myWidget窗口中
btn->setParent(this);//this是当前对象
//显示文本
btn->setText("你好");
完整的maingui.cpp代码
#include "maingui.h"
#include "ui_maingui.h"
#include <QPushButton> //按钮控件的头文件
MainGUI::MainGUI(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainGUI)
{
this->setWindowFlags(Qt::Dialog|Qt::FramelessWindowHint); //去掉标题栏目
//setWindowFlags(Qt::Dialog); //窗体没有最大化最小化按钮
ui->setupUi(this);
QPushButton *btn=new QPushButton;
//让btn对象依赖在myWidget窗口中
btn->setParent(this);//this是当前对象
//显示文本
btn->setText("你好");
//创建第二个按钮
QPushButton *btn2=new QPushButton("世界",this);
//移动按钮
btn2->move(100,100);
//重置窗口的大写
//resize(600,400);
//设置窗口的标题
setWindowTitle("第一个程序");
//setFixedSize(1080,800);
//设置固定窗口大小
}
MainGUI::~MainGUI()
{
delete ui;
}
四、添加一个类的方法
定义好类名字以及父类
五、信号与槽
connect(信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽))
点击按钮关闭窗口
//创建按钮的对象
MyPushButton *mbtn=new MyPushButton;
mbtn->setText("退出");
mbtn->move(1860,0);
mbtn->setParent(this); //设置到对象树中
//参数一:信号发出者 参数二:发送的信号 参数三:信号的接受者 参数四:处理的槽函数
connect(mbtn,&QPushButton::clicked,this,&MainGUI::close); //点击后关掉窗口
六、完整例子
总共有如下几个文件
student.h文件中
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
//返回值void,需要声明喝实现,也可以有参数,可以发生重载
void treat();
void treat(QString foodname);
signals:
};
#endif // STUDENT_H
teacher.h文件中
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定义信号
//返回值为void,只需要声明,不需要实现
//可以有参数,可以重载
void hungry();
void hungry(QString foodname);
};
#endif // TEACHER_H
widget.h文件中
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<student.h>
#include<teacher.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
Teacher *tea;
Student *stu;
void classover();
};
#endif // WIDGET_H
main.cpp文件中
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
student.cpp文件中
#include "student.h"
#include<QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug()<<"请客吃饭";
}
void Student::treat(QString foodname)
{
//foodname会出现引号
qDebug()<<"要吃"<<foodname;
//改成如下,去掉引号
//qDebug()<<foodname.toUtf8().data();
}
teacher.cpp文件中
#include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
widger.cpp文件中
#include "widget.h"
#include "ui_widget.h"
#include "teacher.h"
#include "student.h"
#include<QPushButton>
//Teacher类 老师
//Student类 学生类
//下课后,老师会触发一个信号,饿了,学生响应信号,请客吃饭
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师的对象
this->tea=new Teacher(this);
//创建一个学生的对象
this->stu=new Student(this);
//老师饿了,学生请客的链接
//连接不带参数的信号与槽
//connect(tea,&Teacher::hungry,stu,&Student::treat);
//连接带参数的信号与槽,发生重载后,不能区分出来。
//指针可以指向地址,函数指针可以指向地址
void(Teacher::*teachersignal)(QString)=&Teacher::hungry;
void(Student::*studentslot)(QString)=&Student::treat;
connect(tea,teachersignal,stu,studentslot);
//调用下课函数
classover();
QPushButton *btn=new QPushButton("下课",this);
this->resize(600,400);
//点击按钮触发下课事件
//connect(btn,&QPushButton::clicked,this,&Widget::classover);
//信号连接信号
void(Teacher::*teachersignal2)(void)=&Teacher::hungry;
void(Student::*studentslot2)(void)=&Student::treat;
connect(tea,teachersignal2,stu,studentslot2);
connect(btn,&QPushButton::clicked,tea,teachersignal2);
//断开信号
//参数为连接的四个参数,之后就不可用了
//disconnect(tea,teachersignal2,stu,studentslot2);
//信号可以连接信号
//一个信号可以连接多个槽函数
//多个信号可以连接一个槽函数
//信号和槽函数的参数类型一定一致
//信号和槽的参数个数,不需要一致,信号的参数个数可以多于槽的参数个数
}
void Widget::classover()
{
//下课了,调用老师饿了的信号
emit tea->hungry("小串");
}
Widget::~Widget()
{
delete ui;
}
七、总结
此为第一部分qt学习记录,学习了qt的一些基本操作和信号与槽的机制,代码按照b站上课程进行练习的,慢慢打基础吧。