QT入门(一)

1.下载和安装

QT下载
选择CN镜像下载即可。

2.创建项目

在这里插入图片描述

3.文件目录

在这里插入图片描述
main.app

#include "mywidget.h"

#include <QApplication>//包含一个应用程序类的头文件。

//argc命令行变量的数量,argv是命令行变量的数组
int main(int argc, char *argv[])
{
    //a 应用程序对象 应用程序对象有且仅有一个
    QApplication a(argc, argv);

    //窗口对象  ->QWidget
    myWidget w;
    //窗口对象默认不会显示
    //让代码阻塞到这行
    w.show();

    //让应用程序对象进入消息循环机制
    return a.exec();
}


Project_01.pro

//包含模块
QT       += core gui

//大于4版本,包含widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

//源文件
SOURCES += \
    main.cpp \
    mywidget.cpp

//头文件
HEADERS += \
    mywidget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

在这里插入图片描述

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

class myWidget : public QWidget
{
	//宏  允许类中使用信号和槽的机制
    Q_OBJECT

public:
    myWidget(QWidget *parent = nullptr);
    ~myWidget();
};
#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include <QPushButton>
#include "mypushbutton.h"
#include <QDebug>
myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    //创建一个按钮
    QPushButton * btn = new QPushButton;
    //btn->show();//以顶层方式弹出窗口控件
    //让btn对象依赖在mydgget窗口中
    btn->setParent(this);

    //显示文本
    btn->setText("...");

    //创建二个按钮  但是窗口只有控件大小

    QPushButton * btn2 = new QPushButton("第二个",this);
    //移动btn按钮
    btn2->move(100,100);

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

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

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


    //创建一个自己的按钮的对象
    MyPushButton * myBtn = new MyPushButton;

    myBtn->setText("我自己的按钮");
    myBtn->move(200,0);
    myBtn->setParent(this);
}

myWidget::~myWidget()
{
    qDebug()<<"myWidget的机构调用";
}

命名规范 和快捷键

  1. 首字母大写,单词和单词之间首字母大写
  2. 函数名 和变量名称 首字母小写 ,单词和单词之间首字母大写
  • 运行 ctrl + r
  • 编译 ctrl + b
  • 整行移动 ctrl + shift + ↑ …
  • 帮助文档 F1 ESC C:\Qt\Qt5.12.11\5.12.11\mingw73_64\bin\assistant.exe
  • 自动对齐 ctrl + i
  • 同名之间的.h 和.cpp 切换F4

创建按钮

在这里插入图片描述

#include "mywidget.h"
#include <QPushButton>
myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    //创建一个按钮
    QPushButton * btn = new QPushButton;
    //btn->show();//以顶层方式弹出窗口控件
    //让btn对象依赖在mydget窗口中
    btn->setParent(this);

    //显示文本
    btn->setText("...");

    //创建二个按钮  但是窗口只有控件大小

    QPushButton * btn2 = new QPushButton("第二个",this);
    //移动btn按钮
    btn2->move(100,100);

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

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

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

myWidget::~myWidget()
{

}


对象树

在创建QObject对象时,可以提供一个其父对象,创建的这个QObject对象会自动添加到其父对象的children()列表。
在对父对象析构的时候,列表中的所有对象也同样会被析构。
这里的父对象不是继承意义上的父类。
在这里插入图片描述
myPushButton.cpp

#include "mypushbutton.h"
#include <QDebug>

MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{
    qDebug()<<"我的按钮类的构造";
}
MyPushButton::~MyPushButton()
{
    qDebug()<<"我的按钮类的析构";
}

Qt中的坐标系

左上角为0。
x以右为正方向。
y以下为正方向。

信号和槽

信号槽的优点: 松散耦合:信号的发送方和接受方 本身是没有关联的。
需求:点一个按钮,可以实现关闭功能
翻译:生成一个按钮->点击->窗口(执行关闭操作)->关闭
信号的发送方 信号的接受方
信号 signal 槽 Slots

connect(信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽函数))

connect(myBtn, &QPushButton::clicked, this,&QWidget::close);
connect(myBtn, &MyPushButton::clicked, this,&myWidget::close);

信号函数 需要声明 不需要实现
槽函数 需要声明 需要实现

widget.h
Teacher *zt;
Student *st;

#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:
    Ui::Widget *ui;
    
    Teacher *zt;
    Student *st;

    void classIsOver();

};
#endif // WIDGET_H

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();


signals:

};

#endif // STUDENT_H

Student.cpp

#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{

}

void Student::treat()
{
    qDebug()<<"请老师吃饭";
}

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();

};

#endif // TEACHER_H

Teacher.cpp

#include "teacher.h"

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

}

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);

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

    //老师饿了 学生请吃饭
    connect(zt,&Teacher::hungry,st,&Student::treat);

    //下课函数
    classIsOver();
}

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

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


如果出现重载,在获取函数地址的时候会发生二义性
需要定义一个函数指针指向对应的地址。

    void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
    void(Student:: *studentSignal)(QString) = &Student::treat;

    connect(zt,teacherSignal,st,studentSignal);

拓展

  1. 一个信号可以连接一个信号
  2. 一个信号可以连接多个槽
  3. 多个信号可以连接一个槽
  4. 信号和槽函数中的参数类型 必须一一对应
  5. 信号和槽函数中的参数个数 信号参数的个数可以多余槽参数的个数。也要保证类型一致

lambda表达式

  • [] 标识符 匿名函数
  • () 参数
  • {} 实现体
	[=]()
    {
        btn->setText("xiake");
    }();
	
	a
	[btn]()
    {
        btn->setText("xiake");
        btn2->setText("xiake");//btn2 看不到
    }();
  • = 值传递方式
  • & 引用传递方式
  • this 函数体内可以使用Lambda所在类中的成员变量
  • a 按照值传递方式 只不过有限制
  • &a a按引用传递
  • = ,&a ,&b 出了a b 按照引用 其余按照值传递
  • & , a,b, 除了a b按照值进行传递,其他参数都按引用进行传递

mutable:修改按值传递进来的拷贝 不是本体

QPushButton * mybtn = new QPushButton(this);
      QPushButton * mybtn2 = new QPushButton(this);
      mybtn2->move(100,100);
      
      int m = 10;
      connect(mybtn,&QPushButton::clicked,this,[m]()mutable{m=100+10;qDebug()<<m;});
      connect(mybtn2,&QPushButton::clicked,this,[=](){qDebug()<<m;});

函数返回值:

      int ret = []()->int{return 1000;}();
      qDebug()<<"ret = "<<ret;
      //利用lambda表达式实现点击按钮 关闭窗口
    QPushButton * btn2= new QPushButton;
    btn2->setText("guanbi");
    btn2->move(100,100);
    btn2->setParent(this);
    connect(btn2,&QPushButton::clicked,this,[=](){  //this可省略
        this->close();
        emit zt->hungry("宫保鸡丁");
    });
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qt是一款跨平台的C++图形用户界面开发框架,广泛应用于跨平台应用程序开发。Qt入门教程详细讲解版可以帮助初学者快速入门Qt开发,并了解其基本概念和用法。 首先,Qt入门教程会介绍Qt的基本概念和架构。Qt将应用程序分为窗口和控件,窗口是应用程序的主要界面,控件是窗口内的各种元素。Qt提供了丰富的控件库,包括按钮、文本编辑框、列表框等,开发者可以通过使用这些控件构建界面。 接着,Qt入门教程将介绍Qt的信号与槽机制。信号与槽是Qt的事件处理机制,通过信号与槽,控件之间可以进行交互,实现事件的传递。开发者可以根据需要连接控件的信号与槽,实现特定的功能。 然后,Qt入门教程会详细讲解Qt中常用的控件和布局管理器。控件是开发应用程序的基本单元,包括按钮、标签、文本框等。布局管理器用于控制控件的位置和大小,常见的布局管理器包括水平布局、垂直布局和网格布局。 此外,Qt入门教程还会介绍如何处理用户输入和处理文件操作。Qt提供了丰富的输入控件,如文本框、下拉菜单等,开发者可以通过处理用户输入实现交互式的应用程序。同时,Qt也支持文件操作,开发者可以通过Qt提供的类进行文件的读写操作。 最后,Qt入门教程将介绍如何使用Qt开发跨平台应用程序。Qt支持多个主流操作系统,如Windows、Mac OS和Linux,开发者可以通过Qt实现一次编写,多平台运行的应用程序。 总之,Qt入门教程详细讲解版可以帮助初学者了解Qt的基本概念和用法,并通过实例讲解帮助开发者快速上手Qt开发。通过学习Qt入门教程,开发者可以掌握Qt开发的基本技能,实现跨平台应用程序的开发。 ### 回答2: QT入门教程是一套详细讲解的教程,帮助初学者了解并掌握QT框架的基本知识和使用方法。以下是该教程的详细内容。 首先,教程会先介绍QT框架的概念和特点,帮助学习者了解为什么选择QT作为开发工具,以及QT的优势和适用场景。接着,教程会介绍QT的安装和配置方法,包括如何下载QT开发环境并完成安装和设置。 在环境配置完成后,教程会引导学习者创建第一个QT项目。教程会详细解释QT的项目结构和文件组织方式,让学习者对项目有全面的认识。然后,教程会逐步讲解如何使用QT的图形界面设计工具来创建界面,包括如何添加控件、设置布局等。 接下来,教程会介绍QT的信号与槽机制。学习者将会了解到信号与槽是QT框架中用于组件间通信的一种机制,可以方便地实现事件处理和数据传递。教程会详细解释信号与槽的定义和连接方式,并提供实例让学习者练习。 另外,在教程的后半部分,会介绍QT的常用功能和组件,如文件操作、网络通信、数据库访问等。教程会分别介绍每个功能和组件的基本用法和常见操作,以及提供实例演示。 最后,教程还会涵盖一些进阶主题,如QT的国际化和本地化支持、多线程开发等。这些内容可以帮助学习者进一步扩展和深化自己的QT知识。 以上就是QT入门教程的详细讲解版概述,通过学习这套教程,初学者可以从零开始建立对QT框架的全面理解,学会使用其各种功能和组件,为以后的QT开发打下坚实的基础。 ### 回答3: Qt是一种跨平台的C++框架,用于开发图形用户界面(GUI)应用程序。Qt的主要特点是提供了一套丰富的库和工具,可以简化应用程序的开发过程,并且支持在不同操作系统上运行。为了帮助初学者快速入门Qt开发,下面给出一个详细的教程。 首先,你需要安装Qt开发环境。Qt官网提供了一个Qt安装包,你可以根据你的操作系统下载对应版本。安装完成后,打开Qt Creator,创建一个新的Qt项目。 在Qt Creator中,你可以编辑界面和代码。界面可以通过拖放组件的方式进行设计。点击"设计"选项卡,将需要的控件拖放到窗口中,并设置控件的属性和布局。你还可以通过信号和槽机制来实现控件之间的交互。 在Qt的代码中,你可以实现控件的功能和逻辑。你可以通过信号和槽来连接控件和函数,使得特定的事件触发特定的操作。你还可以使用Qt的各种类和函数来实现界面的绘制、文件的读写、网络通信等功能。 除了GUI应用程序,Qt还支持命令行程序和后端开发。你可以使用Qt构建一个命令行界面,或者作为后端用于处理数据和逻辑。Qt提供了许多工具和库,用于简化这些应用程序的开发过程。 学习Qt的过程中,你可能会遇到一些困难。但是不要担心,Qt有一个活跃的社区和详细的文档,你可以在这些资源中找到帮助。你还可以参加Qt相关的培训课程或者参加Qt的论坛和社区活动,与其他开发者交流经验。 总而言之,Qt是一个强大的框架,用于开发跨平台的图形用户界面应用程序。通过学习Qt的教程和参与实际开发,你可以快速掌握Qt的基本概念和技术,成为一名合格的Qt开发者。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老李头带你看世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值