一、信号与槽的概念

信号:在特定条件下发生的事件,例如QPushButton的基类中的QAbstractButton中的onclick()信号,当电机QPushButton时就会产生信号,其他的信号还有按下,抬起等信号

槽:对信号响应的函数,不使用信号与槽时,与普通函数用法一致

信号与槽的连接:使用函数connect

QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

1.const QObject *sender  :: 信号发送的对象

2.const char *signal  ::发出的信号

3.const QObject *receiver  ::信号接收对象

4.const char *method   ::接收对象的槽函数

5.Qt::ConnectionType type = Qt::AutoConnection  ::连接类型 一般默认就好

函数自带的信号,可以通过QTcreator进行查找,以下时button的自带的信号与槽函数

1.如何使用

在ui中拖入QPushBotton和QTextEdit

主要实现的目标是,点击按钮时,文本框打出"HelloWord"

这里我们使用的是自定义的槽函数onclick()

我们将我们创建的button按钮的clicked信号与这个窗口类相连接,在触发clicked信号时会去调用我们写的onclick()函数,函数功能是在textEdit中添加"HelloWord"

执行后如下:

接下来测试一下按钮的另两个信号,按下和抬起,想要的效果是按下在文本框中输出“按钮按下”,抬起输出"按钮抬起",函数如下:

二、自定义信号与自定义槽

自定义槽:

1、在自定义槽的时候一定要确保该对象继承自QOBject或QOBject的子类,并且在类声明中加上Q_OBJECT宏

2、声明定义与普通的函数一样

自定义信号:

1、在自定义信号时一定要确保该对象继承自QOBject或QOBject的子类,并且在类声明中加上Q_OBJECT宏

2、在定义信号时,只需要写个信号声明函数,并不需要写定义,写法与函数类似,注意返回值一定是void

发送信号: 1、当信号满足条件是,我们就需要发送信号

emit 信号名(参数);

2、信号传递的参数会传给槽对应的参数,因此信号与槽的参数个数和类型要相同

自定义信号方法如下:                          自定义槽:

现在我希望实现一个信号类和槽函数,完成在终端打印Hello ,并打印我通过信号传送的值

定义:

//自定义槽的类

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

MainWindow(QWidget *parent = nullptr);

~MainWindow();

public slots:

void printslot();//槽函数

void printslot(int value);

private:

Ui::MainWindow *ui;

};

//自定义信号的类

class mySignal:public QObject

{

Q_OBJECT

public:

void sendmysignal();//发送信号的函数

void sendmysignal(int value);

signals:

void mysignals();//信号,不需要定义

void mysignals(int value);

};

函数实现:

void MainWindow::printslot(){

qDebug()<<"Hello";

}

void MainWindow::printslot(int value){

qDebug()<<"print value ::"<

}

void mySignal::sendmysignal(){

emit mysignals();

}

void mySignal::sendmysignal(int value){

emit mysignals(value);

}

主函数

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MainWindow w;

mySignal s;

QObject::connect(&s,SIGNAL(mysignals()),

&w,SLOT(printslot()));

QObject::connect(&s,SIGNAL(mysignals(int)),

&w,SLOT(printslot(int)));

s.sendmysignal();

s.sendmysignal(5);

w.show();

return a.exec();

}

执行

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: