信号和槽

一、相关概念

  • 信号signal是由操作系统产生的消息。

  • 槽slot是程序中的消息处理函数。

  • connect将系统消息绑定到消息处理函数。

二、信号

signals是QT的关键字,而非C/C++的。信号可以重载,但信号却没有函数体定义,并且信号的返回类型都是void,信号由moc自动产生,不应该在.cpp文件中实现。

只有定义过这个信号的类及其派生类能够发射这个信号。

例如,下面定义了三个信号

	void mySignal();
	void mySignal(int x);
	void mySignalParam(int x,int y);

三、槽

槽是普通的C++成员函数,可以被正常调用,唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,信号关联的槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。

槽是普通的成员函数,也有访问权限。槽的访问权限决定了谁能够与其相关联。同普通的C++成员函数一样,槽函数也分为三种类型,即public slots、private slots和protected slots。

例如,下面定义了三个槽

	void mySlot();
	void mySlot(int x);
	void mySignalParam(int x,int y);

四、connect

bool QObject::connect ( const QObject * sender, //发生对象

const char * signal, //消息名

const QObject * receiver, //接收对象

const char *method, //接收对象的成员函数

Qt::ConnectionType type = Qt::AutoConnection

)

注意

1. 不管是使用那种方式,要想在子线程里面触发的信号的槽函数在子线程执行,信号槽连接必须使用DirectConnection 方式;

实例

class TsignalApp:public QMainWindow
{
	Q_OBJECT
	...
	//信号声明区
	signals: 
		//声明信号mySignal()
		void mySignal();
		//声明信号mySignal(int)
		void mySignal(int x);
		//声明信号mySignalParam(int,int)
		void mySignalParam(int x,int y);

	//槽声明区
	public slots: 
		//声明槽函数mySlot()
		void mySlot();
		//声明槽函数mySlot(int)
		void mySlot(int x);
		//声明槽函数mySignalParam (int,int)
		void mySignalParam(int x,int y);
}
...

//tsignal.cpp
...
TsignalApp::TsignalApp()
{
	...
	//将信号mySignal()与槽mySlot()相关联
	connect(this,SIGNAL(mySignal()),SLOT(mySlot())); 
	//将信号mySignal(int)与槽mySlot(int)相关联
	connect(this,SIGNAL(mySignal(int)),SLOT(mySlot(int))); 
	//将信号mySignalParam(int,int)与槽mySlotParam(int,int)相关联
	connect(this,SIGNAL(mySignalParam(int,int)),SLOT(mySlotParam(int,int))); 
}

// 定义槽函数mySlot()
void TsignalApp::mySlot()
{
	QMessageBox::about(this,"Tsignal", "This is a signal/slot sample without 
parameter.");
}

// 定义槽函数mySlot(int)
void TsignalApp::mySlot(int x)
{
	QMessageBox::about(this,"Tsignal", "This is a signal/slot sample with one 
parameter.");
}

// 定义槽函数mySlotParam(int,int)
void TsignalApp::mySlotParam(int x,int y)
{
	char s[256];
	sprintf(s,"x:%d y:%d",x,y);
	QMessageBox::about(this,"Tsignal", s);
}
void TsignalApp::slotFileNew()
{
	//发射信号mySignal()
	emit mySignal();
	//发射信号mySignal(int)
	emit mySignal(5);
	//发射信号mySignalParam(5,100)
	emit mySignalParam(5,100);
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×