4. 信号与槽机制应用

任务目标

创建一个Qt Widgets应用程序,界面上放置一个按钮和一个标签。点击按钮时,通过信号与槽机制触发自定义槽函数,实现计数器累加,并将当前计数显示在标签上。

环境依赖

  • Qt 5.15+(含Qt Widgets模块)
  • 编译器:g++(Linux)/ MinGW(Windows)/ Clang(macOS)
  • 构建工具:qmake 或 CMake(本案例使用qmake)

完整实现

创建 counter.pro 项目文件与 main.cpp 源文件,代码如下:

# counter.pro
QT += widgets
TARGET = counter
TEMPLATE = app
SOURCES += main.cpp
// main.cpp
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>

class CounterWindow : public QWidget {
    Q_OBJECT
private:
    int count = 0;
    QLabel *label;
    QPushButton *button;

private slots:
    void incrementCount() {
        ++count;
        label->setText(QString("计数: %1").arg(count));
    }

public:
    CounterWindow(QWidget *parent = nullptr) : QWidget(parent) {
        label = new QLabel("计数: 0", this);
        button = new QPushButton("点击加1", this);

        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(label);
        layout->addWidget(button);

        // 信号与槽连接:按钮点击 → 自定义槽函数
        connect(button, &QPushButton::clicked, this, &CounterWindow::incrementCount);
    }
};

// 包含moc生成代码(因类中含Q_OBJECT宏)
#include "main.moc"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    CounterWindow window;
    window.resize(200, 100);
    window.show();
    return app.exec();
}

运行与验证

  1. 在项目目录执行 qmake && make(Linux/macOS)或 qmake && mingw32-make(Windows)生成可执行文件 counter。
  2. 运行 ./counter(Linux/macOS)或 counter.exe(Windows)。
  3. 验证标准:窗口显示“计数: 0”标签与“点击加1”按钮;每点击一次按钮,标签数字增加1,且窗口无崩溃或报错输出。

关键说明

  • 类中 Q_OBJECT 宏启用Qt元对象系统,使自定义槽函数可被信号连接;因此需在 main.cpp 末尾包含 #include "main.moc",确保qmake自动生成的元对象代码被编译。
  • 连接语法使用函数指针形式(&QPushButton::clicked 到 &CounterWindow::incrementCount),编译期即检查信号与槽签名是否匹配,避免运行时错误。
  • 计数变量 count 为窗口类私有成员,槽函数直接修改并更新标签文本,体现信号与槽在对象间通信中的核心作用。