2. 按钮与信号槽
任务目标
创建一个Qt Widgets窗口,放置一个按钮和一个文本标签。点击按钮后,标签文本在“Hello Qt”与“Button Clicked”之间切换,以此演示信号与槽机制的核心用法。
环境依赖
需要Qt 5或Qt 6开发环境,以及对应版本的编译器(如g++、MinGW或MSVC)。确保qmake或cmake可用。
关键完整代码
// main.cpp
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建主窗口
QWidget window;
window.setWindowTitle("按钮与信号槽");
// 创建控件
QLabel *label = new QLabel("Hello Qt");
QPushButton *button = new QPushButton("点击我");
// 布局
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(label);
layout->addWidget(button);
window.setLayout(layout);
// 信号槽连接:点击按钮时切换标签文本
QObject::connect(button, &QPushButton::clicked, [label]() {
if (label->text() == "Hello Qt") {
label->setText("Button Clicked");
} else {
label->setText("Hello Qt");
}
});
window.resize(300, 150);
window.show();
return app.exec();
}
运行方式
- 将上述代码保存为
main.cpp。 - 在项目目录下创建
.pro文件(若使用qmake):QT += widgets SOURCES = main.cpp TARGET = button_signal - 执行以下命令编译并运行:
qmake make ./button_signal # Windows下为 button_signal.exe
若使用CMake,则创建 CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(button_signal)
find_package(Qt6 REQUIRED COMPONENTS Widgets)
qt6_add_executable(button_signal main.cpp)
target_link_libraries(button_signal Qt6::Widgets)
然后执行 cmake -B build && cmake --build build && ./build/button_signal。
验证方法
- 程序启动后,窗口显示一个标签(文本为“Hello Qt”)和一个按钮。
- 点击按钮,标签文本变为“Button Clicked”。
- 再次点击按钮,标签文本恢复为“Hello Qt”。
- 每次点击都触发切换,说明信号
clicked已成功连接到槽函数(Lambda表达式)。
通过上述交互即可确认信号槽机制工作正常。
关键点说明
- 使用
QObject::connect将按钮的clicked信号连接到Lambda表达式,Lambda捕获label指针以修改其文本。 - 这是Qt 5/6推荐的现代连接语法,编译期即可检查信号与槽的签名匹配。
- 若需在Lambda中访问窗口成员变量,可捕获
this指针;本例因所有对象在main函数中创建,直接捕获局部变量即可。