以下程序在vs2010+qt插件中运行正确。
一、只自定义槽
格式:
1.在.h文件中定义如下
private slots: //实际这是一个宏
type slotName(arg);//和普通的成员函数一样,需要在.cpp文件中写其实现
2.在.cpp中写其实现
type ClassName::slotName(arg)
{
//你的实现
}
3.在.cpp中的构造函数中调用connect函数,该函数是QObject类的静态方法
ClassName::ClassName()
{
ui.setup();
QObject::connect(sender,SIGNAL(你要使用的信号),rece,SLOT(slotName(arg));
}
二、既定义信号也定义槽
需注意的几点:
1.自定义的信号不需要在.cpp中实现,只需在.h中有声明即可,否则会报如下错误:error LNK2005: "protected: void __thiscall ClassName::signalName(参数)" (?signalName@ClassName@@IAEXVQString@@@Z) 已经在 moc_signal_slot.obj 中定义
1>Q:\VS2010Projects\Qt\Signal_Slot\Win32\Debug\\Signal_Slot.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
2.发射信号使用emit
例子:现在通过点击一个按钮,改变窗口的标题,但通过发射自定义信号的方法
1.在.h文件中定义如下:
private slots:
void changeWindowTitle(QString title);//真正用来改变窗口标题的槽
void on_clickButton_Slot();//用来响应按钮clicked信号的槽,在其中发射自定义信号titleMessageSignal
signals:
void titleMessageSignal(QString title);//自定义的信号,带参数
2.在.cpp文件中实现如下:
void ClassName::changeWindowTtile(QString title)
{
this->setWindowTtile(title);
}
void ClassName::on_clickButton_Slot()
{
emit this->titleMessageSIgnal("你想要使用的窗口标题");//发射信号
}
在构造函数中调用connect
QObject::connect(this,SIGNAL(tithleMessageSignal(QString),this,SLOT(changeWindowTitle(QString));