QT中信号与槽连接全集

实例的代码功能:首先我们定义两个类,老师类实现空实现,学生类实现打印老师饿了,当下课后触发信号,学生请老师吃饭。

一.信号与槽重载

当我们需要利用同名的函数传参进行链接时,就要利用函数指针去区分两个重载函数调用哪一个

1.connect函数

参数1:信号发送者 参数2:发送的信号函数(函数地址)
参数3:信号接收者 参数4:处理信号的槽函数(函数地址)

 //创建一个老师对象
  this->LKM= new Teacher(this);
  //创建一个学生对象
  this->LTH= new Student(this); 
  QPushButton *btn =new QPushButton("下课",this);
  btn->move(100,100);
  resize(400,400);
  connect(LKM,teachersignal,LTH,studentsolt); 

2.函数指针的语法说明

这里我们创建了两个类,一个学生类,一个老师类,我们要在teachersignal装入teacher类中的函数hungry的地址。

void hungry(QString foodname);//函数的声明
void (Teacher::*teachersignal)(QString)=&Teacher::hungry;//不是本类的一定要加作用域
    void(Student::*studentsolt)(QString)=&Student::treat;

我们可以看到函数指针的语法是:

函数的返回值 (*地址变量名)(函数的形参) = &函数名

注意点:
1 .函数名只是一个名称,不要加后面的括号,类似于一个变量的变量名一样
2 .如果有类的概念,在类外时,等号左右要加上作用域

3. 当我们传入给hungry传参时,就实现了有参调用

connect(LKM,teachersignal,LTH,studentsolt);
void Widget::classIsOver()//这个是类内的成员函数定义,不能写在构造函数里面
{
    //下课函数,调用后 触发老师饿了的信号
    emit LKM->hungry("鱼香肉丝");//emit是触发关键字
}
void Student::treat()
{
    qDebug()<<"请老师吃饭";
}
void Student::treat(QString foodname)
{
    qDebug()<<"请老师吃:"<<foodname.toutf8.date();
}

二、信号与函数连接

当我们需要实现点击下课按钮时,才会发送请老师吃饭的指令,就需要将信号与槽连接

connect(LKM,teachersignal,LTH,studentsolt);
connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
//记住传函数的地址时,&函数名即可,不要给后面添加括号
//自动添加,或者习惯,要将括号去掉

使用两个连接将信号与函数,函数与函数串联起来,实现功能利用两个连接

三、信号与信号连接

这种适用于无参的情况,不需要中间函数进行参数的传入,直接实现点击按钮信号到触发学生请吃饭的连接。如果连接有参,因为没有上文提到的classIsOver函数传参会报错。

void (Teacher::*teachersignal)(void)=&Teacher::hungry;
    void (Student::*studentsolt)(void)=&Student::treat;
    connect(btn,&QPushButton::clicked,LKM,teachersignal);
    connect(LKM,teachersignal,LTH,studentsolt);

这块也可以将点击信号与学生连接起来,因为老师里是空实现。

断开连接函数

disconnect(LKM,teachersignal,LTH,studentsolt)

四、一个信号连接多个槽函数

一发工资就买iPhone14和ipad ,连接两个

五、多个信号可以连接同一个槽函数

不仅发工资可以买,发奖金也可以买,老婆给钱也可以买。

六、信号函数与槽函数的参数问题

信号与槽的参数类型必须一一对应,就是信号传给槽的形参必须保持一致。
信号与槽的参数个数 是不是要一致? 信号的参数个数只可以等于多于槽函数的参数个数
信号的参数可以自动传递给槽函数

void (Teacher::*teachersignal)(Qstring)=&Teacher::hungry;
    void (Student::*studentsolt)(Qstring)=&Student::treat;
    connect(btn,&QPushButton::clicked,LKM,teachersignal);

上面的代码写入Qstring为什么会出错?
在这里插入图片描述

  1. 通过帮助文档可以看到 信号函数clicked 的参数类型是bool,参数个数是一个,void时,是0个, 信号的参数个数只可以等于多于槽函数的参数个数,满足上述条件,可以成功。
  2. 当槽函数形参是Qstring类型时,信号函数是bool类型,参数类型不一致,所以就会出错。
    在这里插入图片描述
    信号的参数可以自动传递给槽函数
 connect(ui->checkBox_4,&QCheckBox::stateChanged,[](int state){
        qDebug()<<state;
    });
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
采用C/S模式,完成一前台(服务器)对多客服端通讯,用Mysql数据库保存信息; 主要技术: 1.采用TCP/IP协议,容器完成服务端与多客户端的链接 服务端: server=new QTcpServer(this);建立端口 server->listen(QHostAddress::Any,PORT);监听端口 connect(server,SIGNAL(newConnection()),this,SLOT(accpetConnection()));等待用户链接 QTcpSocket* temp = server->nextPendingConnection();建立链接 client.push_back(temp);用户压栈 connect(temp,SIGNAL(readyRead()),this,SLOT(readData()));当端口有数据就读 读数据时先用迭代器遍历容器找到发送信息的客户端,再解析数据并响应 客户端: client=new QTcpSocket(this);建立端口 client->connectToHost(IP,PORT);链接主机 connect(client,SIGNAL(readyRead()),this,SLOT(readData()));端口有数据就读 2.界面布局 服务器 a.主菜单,预订,开台,换台,电子账单功能项采用QToolButton文字置于图片下面,水平布局 b.当前餐台信息与总餐台状态信息用QLabel垂直布局放于主窗体左侧 c.餐台信息采用QGraphicsView+QGraphicsScene+QGraphicsItem布局,view与item需要重写自己的类,Item包括图片与文本信息;将Item放入墙纸scene,墙纸scene贴到墙view上完成显示。 客户端 a.选择桌号与人数用QLabel,对应的下拉选项用QComboBox,确认,呼叫与结账功能用QToolButton,这些控件水平布局放置于窗体最上方 b.左侧用QTabWidget其加入特价菜单与我的菜单两个子窗体 c.间为QGraphicsView+QGraphicsScene+QGraphicsItem布局,布局菜单图片与价格名称,菜单信息服务器发送至客户端与客户端的图片匹配起来。 d.右侧为菜单类型分类按键,采用垂直布局 3.信号机制的运用 a.预订,开台,换台功能的实现:点击对应的按钮触发clicked()信号,与之对应的函数QToolButton *btn = (QToolButton *)sender();区分信号源,弹出对应的子窗体让用户输入相应信息,按确定按钮修改SQL对应Table内容然后发送输入信息信号,主窗体接受到信号调用函数(相应窗体成员调用其布局函数重布局)重新布局整个界面(餐台信息与左侧总餐台状态同时更新) b.鼠标悬浮于餐台信息Item时图片放大:改写了QGraphicsSceneMouseEvent事件实现 c.主菜单与电子账单的显示采用QSqlTableModel+QTableView加载整个SQL相应的Table显示Table内容

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值