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();
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值