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();
}
运行与验证
- 在项目目录执行
qmake && make(Linux/macOS)或qmake && mingw32-make(Windows)生成可执行文件counter。 - 运行
./counter(Linux/macOS)或counter.exe(Windows)。 - 验证标准:窗口显示“计数: 0”标签与“点击加1”按钮;每点击一次按钮,标签数字增加1,且窗口无崩溃或报错输出。
关键说明
- 类中
Q_OBJECT宏启用Qt元对象系统,使自定义槽函数可被信号连接;因此需在main.cpp末尾包含#include "main.moc",确保qmake自动生成的元对象代码被编译。 - 连接语法使用函数指针形式(
&QPushButton::clicked到&CounterWindow::incrementCount),编译期即检查信号与槽签名是否匹配,避免运行时错误。 - 计数变量
count为窗口类私有成员,槽函数直接修改并更新标签文本,体现信号与槽在对象间通信中的核心作用。