一、信号与槽的概念
信号:在特定条件下发生的事件,例如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 ::"<<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();
}
执行