qt connect函数_Qt入门系列(一)

  1. 程序介绍

1.1.pro

#-------------------------------------------------
#
# 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.2main.cpp

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.1QPushButton

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

ca7e4f4d61601bad5f9dabe798c615ba.png

3.2对象树

762d97c4a6525bcf5ceadd9708f03c70.png

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

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

f6a03eb20a29231e1df90c0661cad6a3.png

生成的.h

#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

#include "mypushbutton.h"
#include <QDebug>//打印头文件
​
myPushButton::myPushButton(QWidget *parent) : QPushButton(parent)
{
    qDebug()<<"gou zao";
}
​
myPushButton::~myPushButton()
{
    qDebug()<<"xi gou";
}
​

在mainwindow.cpp中添加

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

3.3坐标系

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

3.4信号与槽

95583a27adebceb2a17d7deb84141a5c.png

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

在mainwindow.cpp中添加

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

 connect(mybt,&myPushButton::clicked,this,&QWidget::close);

3.4.1自定义信号和槽

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

自定义信号:

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

在teahcer.h中

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. 可以有参数,可以发生重载
#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 创建对象,进行链接

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

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

student.h

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

student.cpp

void Student::treat(QString foodNmae)
{
    qDebug<<"请老师吃饭,点菜"<<foodName;
}

实现

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

报错:

2c9b0121ab3d400459364d129e1c1c9b.png

修改:

  //自定义指针
   //指针 -> 地址
   //函数指针 -> 函数地址
  void(Teacher:: *teacherSignal)(QString)=&Teacher::hungry;
  void (Student:: *studentSlot)(QString)=&Student::treat;
​
    connect(zt,teacherSignal,st,studentSlot);
  classIsOver();

e374d859bcb3746e11267082cbd98e27.png

what, 怎么还有引号?

修改student.h

void Student::treat(QString foodNmae)
{
    qDebug<<"请老师吃饭,点菜"<<foodName.toUtf8().data();
}

4b6dc5d0c9998709e3e15fa285cae592.png

3.4.3信号与信号的链接

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

实现中添加

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

QPushButton *but=new QPushButton("xia ke",this);
 this-> resize(600,400);
 connect(but,&QPushButton::clicked,this,&Widget::classIsOver);

818c0cf963adb28ab70f0ae727f1e886.png

无参数的函数中实现

信号链接信号

实现函数修改

    //无参数
    void(Teacher:: *teacherSignal2)(void)=&Teacher::hungry;
    void (Student:: *studentSlot2)(void)=&Student::treat;
     connect(zt,teacherSignal2,st,studentSlot2);
     //信号链接信号
    connect(but,&QPushButton::clicked,zt,teacherSignal2);
​

6230b9f10767153aec0b9242a77743e6.png

具体过程演示:

d0204dc8c85cb5ddd3ed7f2c99a8952a.png

断开信号的链接

 disconnect(zt,teacherSignal2,st,studentSlot2);

c47a4a1c9e77b6c8c53e6448dd586ec8.png

拓展

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

笔记如下:

bf1ab9fdfcc7d98842b62ec3ce97fa49.png

4732d9f5d88afbf43eea93ea33d79760.png

66ae5d416a0c2ea2008386ef4a24e1d7.png

d73ac90e53ceb9765d940ec16d4bc6eb.png

f8beb796b0ef354f291ca3ce80258cdc.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值