前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt入门系列(一)

Qt入门系列(一)

作者头像
用户9831583
发布2022-06-16 15:23:17
4770
发布2022-06-16 15:23:17
举报
文章被收录于专栏:码出名企路

文章首发在博主知乎


1.程序介绍

1.1 .pro文件

代码语言:javascript
复制
#-------------------------------------------------
#
# Project created by QtCreator 2020-03-04T13:51:48
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Q2//可修改主菜单名字
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

1.2 main.cpp

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    //only one,应用程序对象,有且仅仅有一个
    QApplication a(argc, argv);
    //窗口对象,默认不会显示
    MainWindow w;
    //显示窗口,默认单独弹出
    w.show();
    //应用程序进入消息阻塞
    return a.exec();
}

2.快捷方式

  1. 注释:ctrl + /
  2. 运行:ctrl + r
  3. 编译:ctrl + b
  4. 字体缩放:ctrl + 鼠标滚轮
  5. 查找:ctrl + f
  6. 整体移动:ctrl + shift +方向键
  7. 自动对齐:ctrl +i
  8. 帮助文档:F1
  9. 同名之间的 .h 和 .cpp之间切换 F4

3.模块介绍

3.1 QPushButton

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //创建一个按钮
    QPushButton *btn=new QPushButton();
    //依附在主主菜单上
    btn->setParent(this);
    //按钮标题
    btn->setText("one");
    //按钮坐标
    btn->move(0,0);

    //第二个按钮
    QPushButton *btn2=new QPushButton("two",this);
    //按钮大小
    btn2->resize(200,200);
    btn2->move(100,100);
    //主菜单大小,可以拖拽
    resize(600,400);
    //固定主菜单大小
    setFixedSize(400,400);
   // ui->setupUi(this);
    //主菜单标题
    setWindowTitle("lyy");
}

结果显示:

3.2 对象树

从上到下构建,从下到上析构

自建一个类,此类自己选定父亲类,同时生成.h和.cpp文件,包括 .pro中也自动生成,不用手动添加。

生成的.h

代码语言:javascript
复制
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
//自动生成的父类,现在要改成我的父类
#include <QWidget>//改
#include <QPushButton>
class myPushButton : public QPushButton
{
    Q_OBJECT
public:
    //形参不用改动
    explicit myPushButton(QWidget *parent = nullptr);
    //添加代码
     ~myPushButton();

signals:

public slots:
};

#endif // MYPUSHBUTTON_H

生成的.cpp

代码语言:javascript
复制
#include "mypushbutton.h"#include <QDebug>//打印头文件
myPushButton::myPushButton(QWidget *parent) : QPushButton(parent)
{
    qDebug()<<"gou zao";
}

myPushButton::~myPushButton()
{
    qDebug()<<"xi gou";
}

在mainwindow.cpp中添加:

代码语言:javascript
复制
     //增加自己的button
    myPushButton *mybt=new myPushButton;
    mybt->setText("my button");
    mybt->move(200,0);
    //设置到对象树中
    mybt->setParent(this);

3.3 坐标系

左上角为原点,右为X,下为Y正方向

3.4 信号与槽

需求:实现点击button,菜单关闭的功能。

在mainwindow.cpp中添加

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

代码语言:javascript
复制
 connect(mybt,&myPushButton::clicked,this,&QWidget::close);

3.4.1 自定义信号和槽

需求:老师类,学生类,下课后,老师饿了,学生请吃饭

自定义信号:

  1. 写在Signals下
  2. 返回值是void ,只需要声明,不需要实现
  3. 可以有参数,可以重载

在teahcer.h中:

代码语言:javascript
复制
class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    //自定义信号
    void hungry();

public slots:
};

#endif // TEACHER_H

在student.h中:

自定义槽函数:

  1. 早期版本,必须写在public slots: 下,现在可以直接写在public下或者全局函数下
  2. 返回值void,需要声明,也需要实现
  3. 可以有参数,可以发生重载
代码语言:javascript
复制
#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>
class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);

signals:

public slots:
    //自定义 信号槽
    void treat();
};

#endif // STUDENT_H

widget.cpp 创建对象,进行链接

代码语言:javascript
复制
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();
}

//自定义函数
 void Widget::classIsOver()
 {
     emit zt->hungry();
 }

3.4.2 解决重载信号槽

teache.h:

代码语言:javascript
复制
  signals:
   //自定义信号
    void hungry();
    void hungry(QString foodName);

student.h:

代码语言:javascript
复制

public slots:
    //自定义 信号槽
    void treat();
    void treat(QString foodName);

student.cpp:

代码语言:javascript
复制
void Student::treat(QString foodNmae)
{
    qDebug<<"请老师吃饭,点菜"<<foodName;
}

实现

代码语言:javascript
复制
{
//对象创建
this->zt=new Teacher();
this->st=new Student();
connect(zt,&Teacher::hungry,st,&Student::treat);
classIsOver();
}
 void Widget::classIsOver()
 {
     emit zt->hungry(“土豆块”);
 }

报错:

修改:

代码语言:javascript
复制
  //自定义指针
   //指针 -> 地址
   //函数指针 -> 函数地址
  void(Teacher:: *teacherSignal)(QString)=&Teacher::hungry;
  void (Student:: *studentSlot)(QString)=&Student::treat;

    connect(zt,teacherSignal,st,studentSlot);
  classIsOver();

what, 怎么还有引号?

修改student.h

代码语言:javascript
复制
void Student::treat(QString foodNmae)
{
    qDebug<<"请老师吃饭,点菜"<<foodName.toUtf8().data();
}

3.4.3 信号与信号的链接

需求:点击一个下课的按钮,触发下课。

实现中添加:

继续上方有参数的函数中实现

代码语言:javascript
复制
QPushButton *but=new QPushButton("xia ke",this);
 this-> resize(600,400);
 connect(but,&QPushButton::clicked,this,&Widget::classIsOver);

无参数的函数中实现:

信号链接信号

实现函数修改

代码语言:javascript
复制
    //无参数
    void(Teacher:: *teacherSignal2)(void)=&Teacher::hungry;
    void (Student:: *studentSlot2)(void)=&Student::treat;
     connect(zt,teacherSignal2,st,studentSlot2);
     //信号链接信号
    connect(but,&QPushButton::clicked,zt,teacherSignal2);

具体过程演示:

断开信号的链接

代码语言:javascript
复制
 disconnect(zt,teacherSignal2,st,studentSlot2);

拓展

  1. 信号可以与信号链接
  2. 一个信号可以链接多个槽函数
  3. 多个信号可以链接一个槽函数
  4. 信号与槽函数的参数类型必须一一对应
  5. 信号与槽的参数个数是不是要一致?信号的参数个数要多于槽的个数

笔记如下:

参考:黑马程序员

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.2 main.cpp
  • 2.快捷方式
  • 3.模块介绍
  • 3.1 QPushButton
  • 3.2 对象树
  • 3.3 坐标系
  • 3.4 信号与槽
  • 3.4.1 自定义信号和槽
  • 3.4.2 解决重载信号槽
  • 3.4.3 信号与信号的链接
  • 拓展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档