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();
}

运行方式

  1. 将上述代码保存为 main.cpp。
  2. 在项目目录下创建 .pro 文件(若使用qmake):
    QT += widgets
    SOURCES = main.cpp
    TARGET = button_signal
  3. 执行以下命令编译并运行:
    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函数中创建,直接捕获局部变量即可。