QT信号与槽(自定义带参数的信号)

走远了吗. 提交于 2020-10-25 04:56:10

关于QT信号与槽的问题其实每个初学QT的人都会遇到,当时我需要做一个带界面的demo,在信号和槽的问题上,我需要的想法是让槽可以有参数的进行操作,但是系统内置的clicked()信号是不含参数的,这对当时根本没接触过QT的我来说就很没头绪,无奈之下只好选择了使用全局变量这个下下策,还好我的demo代码量呀不是很大。我当时是借了一本QT CREATOR快速入门,虽说是好书,但是也很难静得下心来看,于是选择在网上翻阅资料将信号与槽这一部分内容给初步整理了下,得出自己的见解。
QT的作用是做出一个可视化的交互见面,这一点跟中学学的VB很像,当然两者的能力就天差地别了。在QT中,通过控件来实现需求。这里我用最简单的按钮QPushButton和输入框QLineEdit作演示,希望这篇博客能让你对信号和槽有个印象。
为了尽量简洁的说明信号问题,在创建QT项目时选择基类为Widget,不勾选界面。
首先,在QT帮助文档里是有内置的SIGNAL和SLOT的,在SIGNAL中有一个clicked信号,默认参数bool。这里我们需要新建一个按钮,同时定义一个槽函数(槽函数即接收到信号时所做出的行为)。


 	QPushButton *b2=new QPushButton(this);
    b2->move(50,50);
    b2->setText("Send Signal");
    edit=new QLineEdit(this);
     edit->setText("Ready to recv");//edit定义在类中,之后要用到
    connect(b2,&QPushButton::clicked,this,&Signal::MySlot);

因为需要用到类QPushbutton,故需包含相应的头文件,这边着重讲解connect函数。
connect函数用于将信号的发出者和信号的处理者联系起来,第一第三个参数分别为发出者和接收者,注意为指针类型,this为对象的指针,这一点和C++语法一样。第二参数为信号,第四参数为槽函数,均可自定义。这里clicked为系统内置信号,在b2接收到clicked(鼠标点击信号)后,对象(此处为主窗口)作出MySlot反应,MySlot为我定义的一个槽函数。也就是说,此时我按下b2按钮,窗口会运行MySlot函数。
在理解以上内容的基础上,下面将介绍重点,即自定义信号,编写带函数参数的槽函数:

signals:
    void mySignal(QLineEdit*,int );
private slots:
    void MySlot();
    void MyDel(QLineEdit *edit,int x);

上述为在头文件中,注意在定义信号时要在前面加上signals ,且信号和槽的返回值均为void,此时我定义了一个信号,它将传递一个QLineEdit*型参数和一个int型参数

void Signal::MySlot()
{
    emit mySignal(edit,5);
}
void Signal::MyDel(QLineEdit *edit,int x)
{
   edit->setText("The Num is "+QString::number(x));
}

自定义槽函数MySlot(),此槽函数仅仅用于发送之前定义的带参数的信号mySignal(),之前此槽函数与按钮b2的clicked信号已经connect过,故点击b2,将发送信号mySignal(edit,5);

     connect(this,&Signal::mySignal,this,&Signal::MyDel);
  • 1

connet 此自定义的信号和槽函数MyDel(QLineEdit *edit,int x),接受到此信号是,操作MyDel,用于给edit设置文本属性。
下面附上效果图按下按钮前
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!