QT学习之入门

1 QT简介

1.1 跨平台图形界面引擎

1.2 历史

1.3 优点

    跨平台
    接口简单,容易上手
    一定程度上简化了内存回收

1.4 版本

    商业版
    开源版

1.5 成功案例

    linux桌面环境 KDE
    谷歌地图
    VLC多媒体播放器

2 创建第一个Qt程序

/*QT快捷键*/
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
字体缩放 ctrl + 鼠标滚轮
查找 ctrl + f
整行移动 ctrl + shift + ↑ 或者↓
帮助文档 F1、工具栏、Assisant程序
自动对齐 ctrl + i
同名之间的.h 和 .cpp切换 F4
  1. 点击创建项目后,选择项目路径以及给项目起名称。
  2. 名称 - 不能有中文,不能有空格。
  3. 路径 - 不能有中文路径。
  4. 默认创建有窗口类,Mywidget,基类有三种选择:QWidget、QMainWindow、QDialog。
  5. main函数
int main(int argc, char *argv[])
{
    /* a应用程序对象,在QT中,应用程序对象有且只有一个 */
    QApplication a(argc, argv);
    /* 窗口对象 MyWidget父类 -> QWidget */
    MyWidget w;
    /* 窗口对象 默认不会显示,必须要调用show方法显示窗口 */
    w.show();

    /* 让应用程序对象进入消息循环,让代码阻塞在这行*/
    return a.exec();
}

3 按钮控件常用API

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)                   //初始化列表
{
    //创建一个按钮
    QPushButton * btn = new QPushButton;
    //btn->show();        //show以顶层方式弹出窗口控件
    //让btn对象依赖在mywidget
    btn->setParent(this);

    //显示文本
    btn->setText("第一个按钮");

    //创建第二个按钮,按照控件大小创建窗口
    QPushButton * btn2 = new QPushButton("第二个按钮", this);

    //移动btn2按钮
    btn2->move(100, 10);

    //重置按钮大小
    btn2->resize(100, 100);

    //重置窗口大小
    resize(600, 400);

    //设置固定窗口大小
    setFixedSize(600, 400);

    //设置窗口标题
    setWindowTitle("第一个窗口");
}

4 对象树

当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树种。
一定程度上简化了内存回收机制。
在这里插入图片描述

5 坐标系

左上角为(0, 0)点,x以右为正方向,y以下为正方向。

6 信号和槽

  1. 连接函数。
  2. 参数:信号的发送者,发送的信号,信号的接受者,处理的槽函数。
  3. 松散耦合。
  4. 实现点击按钮->关闭窗口的案例。
  5. connect(&btn, &QPushButton::clicked, this, &QWidget::close); 。

7 自定义信号和槽

  1. 自定义信号(返回值void,需要声明需要实现,可以重载,写到signals下)。
  2. 自定义槽函数(可以有参数,可以重载,写到public slot或者public或者全局函数)。
  3. 触发自定义的信号:emit。
  4. 案例:下课后老师触发饿了信号,学生响应信号请客吃饭。

8 自定义信号和槽重载

  1. 需要利用函数指针,明确指向函数的地址
  2. void(Teacher::*tSignal)(QString) = &Teacher::hungry;
  3. QString转char *
    1. QString.ToUtf8(); => QString转为QByteArray;
    2. QByteArray.Data(); => QByteArray转为char *
/* Student.h */
#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);

    //slot:
    //早期QT版本必须写到public slots,高版本可以写到pulic或者全局下
    //返回值void,需要声明,也可以实现
    //可以有参数,可以发生重载
    void treat();
signals:

};

#endif // STUDENT_H

/* Student.cpp */
#include "student.h"
#include <QDebug>

Student::Student(QObject *parent)
    : QObject{parent}
{

}

void Student::treat()
{
    qDebug() << "Invite the teacher to dinner";
}

/* Teacher.h */
#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    //自定义信号 写到signal下
    //返回值是void,只需要声明不需要实现
    //可以有参数,可以重载
    void hungry();
};

#endif // TEACHER_H

/* Teacher.cpp */
#include "teacher.h"

Teacher::Teacher(QObject *parent)
    : QObject{parent}
{

}

/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "teacher.h"
#include "student.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    void classIsOver();

    Ui::Widget *ui;

    Teacher * zt;
    Student * st;
};
#endif // WIDGET_H

/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"

//Teacher类
//Student类
//下课后,老师会触发一个信号(饿了),学生响应信号(请客吃饭)

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个老师的对象
    this->zt = new Teacher();

    //创建一个学生的对象
    this->st = new Student();

    //老师饿了 学生请客的连接
    connect(zt, &Teacher::hungry, st, &Student::treat);

    //调用下课函数
    classIsOver();

}

Widget::~Widget()
{
    delete ui;
}

void Widget::classIsOver()
{
    //下课函数,调用后  触发老师饿了的信号
    emit zt->hungry();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值