2011年8月24日 星期三

Automatic Connections Qt signals and slots

QT 著名的 signal/slot 設定, 每每都要寫個 connect(), 來將 singla/slot 做聯結, 說實在的, 還蠻麻煩的, 最近突然看到有 Automatic Connections Qt signals and slots 這東西, 研究如下:

要符合幾個條件才能自動 connect signal/slot。以下是我測試可行的方式, 因為我找不到 qt 正式文件, 不確定正確的步驟。

QPushButton *okButton;
這是按鈕, 我們期待按了之後執行某個 funcion。
要自動聯結的 slot 取名為:
on_okButton_clicked()

紅色的 okButton 就是 okButton->setObjectName(QString::fromUtf8("okButton"));
設定的名稱, clicked() 就是 single name, on 就 on 囉。

okButton = new QPushButton(this);

以下兩行在我的測試中一定要有, 否則 auto-connect 會失敗。
okButton->setObjectName(QString::fromUtf8("okButton"));
QMetaObject::connectSlotsByName(this) ;

QMetaObject::connectSlotsByName(this) ; 這一行甚至一定要放在 funcion 最後面, 例如:

{
okButton = new QPushButton(this);


okButton->setObjectName(QString::fromUtf8("okButton"));
QMetaObject::connectSlotsByName(this) ; // 最後一行
}


否則一樣會失敗。

void Classname::on_okButton_clicked()
{
    qDebug() << " on_okButton_clicked()";
}

沒什麼意外的話, 按下 button 就會執行 on_okButton_clicked(), 也會看這 member function 印出的字串。

若不成功怎麼辦, 不會怎樣, 乖乖用 connect 來聯結 single/slot 就好了。不過這真的還蠻好用的。

ref:
http://lists.qt.nokia.com/pipermail/qt-interest/2010-January/017651.html
http://qtway.blogspot.com/2010/08/automatic-connections-using-qt-signals.html

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。