Qt 自動連線機制訊號與槽

槑孒發表於2024-09-08

概述

Qt 提供了自動連線機制,可以根據特定的命名規則自動將訊號與槽連線。這種機制簡化了訊號與槽的連線工作,無需顯式地呼叫 QObject::connect

命名規則

自動連線機制依賴於特定的槽函式命名規則。槽函式名稱的格式為:

on_<objectName>_<signalName>
  • objectName:是發射訊號的物件的名稱。
  • signalName:是訊號的名稱(例如 clickedtriggered 等)。

設定物件名稱

在使用自動連線機制之前,需要為訊號發射物件設定物件名稱。可以透過 setObjectName 方法實現:

QAction *actionOpenA = new QAction("Open Window A", this);
actionOpenA->setObjectName("action_WindowA");

示例

假設有一個 MainWindow 類和兩個視窗類 WindowAWindowB,並希望透過選單項來彈出這兩個視窗。

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 的自動連線機制透過規範的命名規則自動連線訊號和槽,減少了手動連線的程式碼量。只需設定正確的物件名稱,並確保槽函式的命名符合規則即可。

相關文章