槽是普通的 C++ 成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。 槽函数分为三种类型,即 public slots、private slots 和 protected slots。
通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) [static]
这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号 signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect 调用中接收者参数可以省略。
#include
#include "mainwidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
mainwidget w;
w.show();
return a.exec();
}
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include
#include
#include "subwidget.h"
class mainwidget : public QWidget
{
Q_OBJECT //信号槽实现
public:
mainwidget(QWidget *parent = 0);
~mainwidget();
QPushButton btn1;//按钮1
QPushButton *btn2;//按钮2
subwidget w2;//子类窗口对象
public slots:
void popUPSlot();
void returnSlot();
};
#endif // MAINWIDGET_H
#include "mainwidget.h"
mainwidget::mainwidget(QWidget *parent)//构造函数
: QWidget(parent)
{
//设置主窗口大小即标题
this->setWindowTitle("father window");
this->setGeometry(50,50,500,500);
//设置按钮btn1
btn1.setParent(this);
btn1.setText("close");
//设置按钮btn2
btn2=new QPushButton(this);
btn2->setText("jump");
btn2->move(100,100);
//标准信号槽
connect(&btn1,SIGNAL(pressed()),this,SLOT(close()));
//绑定按钮btn2和函数popUPSlot(),点击按钮时执行popUPSlot()函数
connect(btn2,SIGNAL(pressed()),this,SLOT(popUPSlot()));
//绑定子窗口对象w2和函数returnSlot(),若收到子窗口发来的mySignal()信号则执行returnSlot()
connect(&w2,SIGNAL(mySignal()),this,SLOT(returnSlot()));
}
mainwidget::~mainwidget()//析构函数
{
}
void mainwidget::popUPSlot()//跳转到子窗口
{
w2.show();
this->hide();
}
void mainwidget::returnSlot()//返回主窗口
{
this->show();
w2.hide();
}
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include
#include
class subwidget : public QWidget
{
Q_OBJECT
public:
explicit subwidget(QWidget *parent = 0);
QPushButton *sub_b1 ;//返回按钮
signals:
void mySignal();//自定义的返回信号,用来发送给父窗口
public slots:
void sendSignal();//槽函数,用来发送返回信号
};
#endif // SUBWIDGET_H
#include "subwidget.h"
subwidget::subwidget(QWidget *parent) :
QWidget(parent)
{
//设置主窗口大小即标题
this->setWindowTitle("son window");
this->setGeometry(50,50,500,500);
//设置返回按钮sub_b1
sub_b1 = new QPushButton(this);
sub_b1->setText("return");
//绑定返回按钮sub_b1和sendSignal(),即点击按钮时发送给父窗口mySignal()信号
connect(sub_b1,SIGNAL(clicked()),this,SLOT(sendSignal()));
}
void subwidget::sendSignal()
{
emit mySignal();//发送给父窗口信号(广播信号)
}