欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt(一)

程序员文章站 2024-01-03 09:19:46
...

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. 对象树

Qt(一)Qt(一)
7.1所有new出来的对象 不用管释放
7.2原因 children表中的对象会在窗口关闭后进行自动释放

8. Qt中的坐标系

8.1x正向 →
8.2y正向 ↓

9. Qt中的信号和槽

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();
}
相关标签: Qt

上一篇:

下一篇: