以下程序在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));