Qt(一)
文章目录
1. 历史
1.11991 奇趣科技
2. 优点
2.1跨平台
2.2效率高
2.3嵌入式
2.4市场份额好
3. 成功案例
3.1Linux桌面环境 KDE
3.2wps
3.3谷歌地图
3.4屏幕共享
3.5VLC
4. Pro文件
4.1QT += 所属模块 widget 4 版本以上
4.2TARGET 生成exe程序名称
4.3TEMPLATE app 应用程序模板
4.4SOURCE HEADER 源文件 头文件
5. Main函数
5.1QApplication a 应用程序对象 有且仅有一个
5.2a.exec() 进行消息循环 阻塞
5.3MyWidget w 窗口对象
5.4默认不会弹出窗口 想要显示窗口 需要调用 show
6. QPushButton
6.1QPushButton * btn = new QPushButton;
6.2btn->setParent(this) 设置父亲
6.3btn->setText (“aaa”)
6.4btn->move( x, y)
6.5重置窗口大小 resize(w,h)
6.6重置窗口标题 setWindowTitle(“aaaa”)
6.7设置固定窗口大小 setFixedSize(w,h)
firstQt
firstQt.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = firstQt
TEMPLATE = app
SOURCES += main.cpp\
mywidget.cpp \
mybutton.cpp
HEADERS += mywidget.h \
mybutton.h
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
//继承与QWidget
class MyWidget : public QWidget
{
//支持Qt中的信号和槽使用
Q_OBJECT
public:
MyWidget(QWidget *parent = 0); //构造
~MyWidget(); //析构
};
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include<QPushButton>
#include "mybutton.h"
#include <QDebug>
//命名规范
//类名 首字母大写、单词与单词之间 首字母大写
//函数、变量名称首字母小写 单词与单词之间首字母大写
//帮助文档的查看方式
//第一种 f1查看
//第二种 左侧的按钮
//第三种 exe程序
//快捷键
//编译+运行 ctrl +r
//编译 ctrl+b
//帮助文档 f1
//字体大小 ctrl + 鼠标滚轮
//同名的.h 和.cpp之间的切换 F4
//注释 ctrl+ /
//查找关键字 ctrl +f
// ctrl + shift +↑ 或者↓
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
QPushButton * btn =new QPushButton;
// btn->show();
//btn应该依赖于主窗口
btn->setParent(this);
//显示文字
btn->setText("德玛");
//第二种创建方式
QPushButton * btn2 = new QPushButton("德玛西亚",this);
//移动窗口
btn2->move(100,100);
//重置窗口大小
resize(960,640);
//btn可不可以 resize? 可以
btn2->resize(50,50);
//设置窗口标题名称
this->setWindowTitle("德玛西亚万岁");
//对象树
MyButton * myBtn = new MyButton();
myBtn->setParent(this);
myBtn->move(200,200);
myBtn->setText("我的按钮");
//窗体的坐标系
//左上角为 0 0 点
// x 以右侧为正方向 y 以下侧为正方向
//需求 点击“我的按钮” ,关闭窗口
//连接信号槽的关键字 connect
//4个参数 参数1 信号发送者 参数2 发送的信号 参数3 信号的接受者 参数4 处理的槽函数
//参数2 和参数4 需要的都是函数地址
connect(myBtn,&QPushButton::clicked,this,&MyWidget::close);
}
MyWidget::~MyWidget()
{
qDebug("MyWidget析构了!");
}
mybutton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QWidget>
#include <QPushButton>
class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = 0);
~MyButton();
signals:
public slots:
};
#endif // MYBUTTON_H
mybutton.cpp
#include "mybutton.h"
#include <QDebug>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{
}
MyButton::~MyButton()
{
qDebug() << "MyButton调用析构了!";
}
main.cpp
#include "mywidget.h" //包含头文件
#include <QApplication> //包含QApplication头文件
//程序入口 argc命令行变量的数量 argv命令行变量数组
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //a 应用程序对象,对于Qt项目必须有应用程序对象,而且有且仅有一个
MyWidget w; //创建一个MyWidget对象
w.show(); //创建出的窗口对象并不会直接显示,需要调用show方法
return a.exec(); //进入消息循环机制,阻塞状态
// while(true)
// {
// if(点击叉子)
// break;
// }
}
7. 对象树
7.1所有new出来的对象 不用管释放
7.2原因 children表中的对象会在窗口关闭后进行自动释放
8. Qt中的坐标系
8.1x正向 →
8.2y正向 ↓
9. Qt中的信号和槽
9.1需求 点击按钮 关闭窗口
9.2connect( 信号发送者,发送的信号,信号接受者,处理槽函数 )
9.3优点 松散耦合
10. Qt中的自定义信号和槽
10.1自定义信号
10.1.1 返回值 void
10.1.2 需要声明 不需要实现
10.1.3 可以有参数
10.2自定义槽函数
10.2.1返回值void
10.2.2需要声明 需要实现
10.2.3可以有参数
10.3触发自定义的信号
10.3.1 emit
10.4当自定义信号和槽 出现重载时候,原先写法失效,因为执行的函数地址不明确
10.5解决方法: 利用函数指针 来明确指向哪个函数的地址
10.6QString转char* toUtf8 转 QBtyeArray 类型 在利用data 转成char*
11. 信号和槽的拓展
11.1信号是可以连接信号的
11.2信号和槽可以断开 disconnect
11.3一个信号可以连接多个槽函数
11.4多个信号可以连接同一个槽函数
11.5信号和槽函数的个数必须一一对应
11.6信号的参数个数 可以大于槽函数的参数个数 ,反之不可以
12. Qt4版本信号槽写法
12.1 信号: SIGNAL下
12.2 槽: SLOT下
12.3 优点: 参数直观 不用写函数指针
12.4 缺点:不会做类型检测
13. Lambda表达式
13.1{}
13.2[]内部 = 值传递 推荐 &引用传递 不推荐
13.3()参数
13.4{} 函数实现体
13.5mutable改变值传递的内部变量
13.6返回值 -> type { };
singaleAndSlot
singaleAndSlot.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = singaleAndSlot
TEMPLATE = app
SOURCES += main.cpp\
widget.cpp \
teacher.cpp \
student.cpp
HEADERS += widget.h \
teacher.h \
student.h
teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = 0);
//信号 自定义的信号 写到signals 下
signals:
//信号返回值是void
//信号只需要声明 不需要实现
void hungry();
void hungry( QString foodName );
void hungry(int);
//槽函数可以写到public slots
public slots:
};
#endif // TEACHER_H
teacher.cpp
#include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = 0);
signals:
public slots:
//请客的槽函数 槽函数必须要实现
void treat();
void treat(QString foodName);
};
#endif // STUDENT_H
student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug() << "请老师吃饭了!";
}
void Student::treat(QString foodName)
{
//QString -> char *
//QString str str.toUtf8().data();
qDebug() << "请老师吃饭了!,老师要吃:" << foodName.toUtf8().data() ;
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "teacher.h"
#include "student.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
//下课了
void classIsOver();
Teacher * zt ;
Student * st;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QPushButton>
#include <QDebug>
//需要
//Teacher类 饿了
//Student类 请客
//下课 classIsOver
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
zt = new Teacher(this);
st = new Student(this);
//连接信号和槽
void(Teacher:: * teacherSingal1)(void) =&Teacher::hungry;
void(Student:: * studentSlot1)(void) = &Student::treat;
connect(zt,teacherSingal1,st,studentSlot1);
//断开信号和槽连接
disconnect(zt,teacherSingal1,st,studentSlot1);
//指针 地址
//函数指针 函数地址
// void(Teacher:: * teacherSingal)(QString) =&Teacher::hungry;
// void(Student:: * studentSlot)(QString) = &Student::treat;
// connect(zt,teacherSingal,st,studentSlot);
//classIsOver();
//信号连接信号
QPushButton* btn = new QPushButton;
btn->setParent(this);
btn->setText("下课!");
connect(btn,&QPushButton::clicked,zt,teacherSingal1);
//Qt 4 如何写信号和槽
//优点 参数直观显示
//确定,编译时候不会检测类型错误
//Qt 5版本兼容Qt4 版本的信号槽写法,反之不可以
connect(zt,SIGNAL(hungry(QString)),st,SLOT(treat(QString)));
classIsOver();
//Lambda表达式
QPushButton * myBtn = new QPushButton(this);
QPushButton * myBtn2 = new QPushButton(this);
myBtn2->move(100,100);
int m = 10;
//使用mutable 可以改变 值传递的变量
connect(myBtn,&QPushButton::clicked,this,[m] ()mutable { m = 100 + 10; qDebug() << m; });
connect(myBtn2,&QPushButton::clicked,this,[=] () { qDebug() << m; });
// qDebug() << m;
//返回值
int num = []()->int{ return 1000;}();
// qDebug() << "num: " <<num;
//lambda表达式在连接时候可以写3个参数,默认第三个参数是this
QPushButton * btn3 = new QPushButton("点击修改显示内容",this);
btn3->move(0,200);
connect(btn3,&QPushButton::clicked,[=](){
btn3->setText("哈哈");
});
}
void Widget::classIsOver()
{
//发送自定义的信号
emit zt->hungry();
//发送带参数的信号
//emit zt->hungry(QString("宫保鸡丁"));
}
Widget::~Widget()
{
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}