QT学习笔记(二)

QT 专栏收录该内容
6 篇文章 0 订阅

自定义信号和槽重载处理

昨天已经把自定信号和槽写好了,今天需要把信号设置为带参的形式。
1、在teacher.h中加入同名带参函数hungry(QString foodname)

//teacher.h
#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>


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

signals:
    void hungry();
    void hungry(QString foodname);

public slots:
};

#endif // TEACHER_H

2、在student.h与student.cpp中也声明并自定义同名带参函数treat(QString foodname);

//student.h
#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();
    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){
    qDebug()<<"请老师吃:"<<foodname.toUtf8().data();
}

3、在主窗口.cpp文件中测试,emit用于触发信号。

//MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPushButton>
#include"mybutton.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton * btn = new QPushButton;//创建按钮
    btn->setParent(this);//给按钮设置setParent属性,使其作用在当前作用域下(在窗口上方显示)
    btn->setText("QT第一个按钮");//给按钮设置文字
    btn->setFixedSize(100,50);//设置按钮大小,(X,Y),X
    QPushButton * btn2 = new QPushButton("QT第二个按钮",this);//第二个按钮
    resize(800,600);//设置主窗口大小
    btn2->move(100,100);//设置按钮坐标,起始坐标(0,0)位于窗口左上角,(X,Y)中X表示横坐标,Y表示纵坐标,
    setWindowTitle("QT的第一个窗口标题"); //设置主窗口标题
    MyButton * my = new MyButton; //创建自定义按钮
    my->move(100,300);
    my->setText("我自己的按钮");
    my->move(300,0);
    my->setParent(this);
    this->st = new student;//在当前域下创建学生对象
    this->te = new teacher;//在当前域下创建老师对象
//    connect(btn, &QPushButton::clicked, this, &MainWindow::close);
//    connect(te,&teacher::hungry,st,student::treat);
//    overclass();
    void (teacher:: *teachersignal)(QString) = &teacher::hungry;//定义函数指针指向teacher类中的带参数的信号函数hungry
    void (student:: *studentslot)(QString) = &student::treat;//定义函数指针只想student类中带参数的槽函数treat
    connect(te,teachersignal,st,studentslot);
    overclass();
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::overclass(){
    emit te->hungry("番茄炒蛋");

}

运行控制台打印以下输出
在这里插入图片描述
小结:信号和槽函数发生重载时,需先定义函数指针指向明确的函数地址,再调用connect连接信号和槽,否则编译无法通过,因为编译器不知道你发送信号的函数是哪一个。QString 转为 char *的方式为
QString.toUtf8().data(),若不转换类型,控制台输出的是带双引号的字符串。

信号的连接

信号连接按钮

定义一个新的QPushbuton按钮,再将其连接触发信号函数overclass

QPushButton * newbtn = new QPushButton("下课",this);
    newbtn->move(100,400);
    connect(newbtn,&QPushButton::clicked,this,&MainWindow::overclass);

信号连接信号

先将信号函数地址改为之前无参的那个,因为信号函数的参数必须大于或等于槽函数参数,且参数类型必须一一对应。void (teacher:: *teachersignal)(void) = &teacher::hungry;
再做连接connect(newbtn,&QPushButton::clicked,te,teachersignal);

disconnect断开信号

disconnect(newbtn,&QPushButton::clicked,te,teachersignal);

Lambda表达式

形式:{}
[]是Lambda表达式的标识符
= 值传递
& 引用传递
() 参数
{} 实现体
mutable 修饰值传递变量 ,可以修改拷贝的数据,改变不了本体
[] ()->int 返回值(此例为int类型)

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值