概述
Qt 提供了自動連線機制,可以根據特定的命名規則自動將訊號與槽連線。這種機制簡化了訊號與槽的連線工作,無需顯式地呼叫 QObject::connect
。
命名規則
自動連線機制依賴於特定的槽函式命名規則。槽函式名稱的格式為:
on_<objectName>_<signalName>
objectName
:是發射訊號的物件的名稱。signalName
:是訊號的名稱(例如clicked
、triggered
等)。
設定物件名稱
在使用自動連線機制之前,需要為訊號發射物件設定物件名稱。可以透過 setObjectName
方法實現:
QAction *actionOpenA = new QAction("Open Window A", this);
actionOpenA->setObjectName("action_WindowA");
示例
假設有一個 MainWindow
類和兩個視窗類 WindowA
和 WindowB
,並希望透過選單項來彈出這兩個視窗。
1. 定義槽函式
在 MainWindow
類中定義槽函式,按照自動連線的命名規則:
// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class WindowA;
class WindowB;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
private slots:
void on_action_WindowA_triggered();
void on_action_WindowB_triggered();
private:
WindowA *windowA;
WindowB *windowB;
};
#endif // MAINWINDOW_H
2. 實現槽函式
在 MainWindow
類的實現檔案中,實現這些槽函式:
// MainWindow.cpp
#include "MainWindow.h"
#include "WindowA.h"
#include "WindowB.h"
#include <QMenuBar>
#include <QAction>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), windowA(nullptr), windowB(nullptr)
{
QMenu *fileMenu = menuBar()->addMenu("File");
QAction *actionOpenA = new QAction("Open Window A", this);
QAction *actionOpenB = new QAction("Open Window B", this);
// 設定物件名稱以匹配槽函式的命名規則
actionOpenA->setObjectName("action_WindowA");
actionOpenB->setObjectName("action_WindowB");
fileMenu->addAction(actionOpenA);
fileMenu->addAction(actionOpenB);
}
void MainWindow::on_action_WindowA_triggered()
{
if (!windowA) {
windowA = new WindowA(this);
}
windowA->show();
}
void MainWindow::on_action_WindowB_triggered()
{
if (!windowB) {
windowB = new WindowB(this);
}
windowB->show();
}
3. 主函式
// main.cpp
#include <QApplication>
#include "MainWindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
}
注意事項
- 物件名稱唯一性:確保為每個
QAction
設定唯一的物件名稱,以避免命名衝突。 - 槽函式命名:槽函式的命名必須符合
on_<objectName>_<signalName>
的規則,否則 Qt 不會自動連線訊號和槽。
總結
Qt 的自動連線機制透過規範的命名規則自動連線訊號和槽,減少了手動連線的程式碼量。只需設定正確的物件名稱,並確保槽函式的命名符合規則即可。