在查看Qt一些項目的時候,代碼中竟然找不到signal和slot的連接。但是最終的程序,slot卻又能準確的響應信號。爲什麼?
經過一番認(上)真(網)學(百)習(度),在 ui->setupUi(this); 函數中最後有一句這樣的代碼:
QMetaObject::connectSlotsByName(MainWindow);
再去看QT助手,其函數原型是這樣的:
[static] void QMetaObject::connectSlotsByName(QObject *object)
給出的說明:遞歸搜索給定對象的所有子對象,並將來自這些子對象的匹配信號連接到以下形式的對象插槽:
void on_<object name>_<signal name>(<signal parameters>);
假設我們的對象有一個類型爲QPushButton的子對象,對象名爲button1。捕捉按鈕的clicked()信號的槽是:
void on_button1_clicked();
如果對象本身具有正確設置的對象名稱,則其自身的信號也將連接到其各自的插槽。
綜上所述,只要槽函數名規則是這樣的:on_子對象名_信號名,如:
public slots:
void on_actionNew_triggered();
就可以不用寫connect函數來連接信號和槽了!但是需要注意的是:
1、儘量不要讓QObject出現相同的objectName
2、如果同名,connectSlotsByName只會給其中一個建立缺省的信號槽的連接