2. 按钮点击事件处理

任务目标

创建一个Qt窗口,包含一个按钮和一个标签。点击按钮时,标签文本在“Hello World”和“Button Clicked”之间切换,演示Qt信号与槽的基本连接方式。

环境依赖

需要Qt 5或Qt 6开发环境,以及对应的C++编译器。本案例使用Qt Widgets模块,无需额外第三方库。

关键完整代码

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>

class MyWindow : public QWidget {
    Q_OBJECT
public:
    MyWindow(QWidget *parent = nullptr) : QWidget(parent) {
        // 创建控件
        label = new QLabel("Hello World", this);
        button = new QPushButton("Click Me", this);

        // 设置布局
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(label);
        layout->addWidget(button);

        // 信号与槽连接:点击按钮时切换标签文本
        connect(button, &QPushButton::clicked, this, &MyWindow::onButtonClicked);
    }

private slots:
    void onButtonClicked() {
        if (label->text() == "Hello World") {
            label->setText("Button Clicked");
        } else {
            label->setText("Hello World");
        }
    }

private:
    QLabel *label;
    QPushButton *button;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyWindow window;
    window.resize(300, 150);
    window.setWindowTitle("Button Click Demo");
    window.show();
    return app.exec();
}

#include "main.moc"

运行方式

  1. 将上述代码保存为 main.cpp。
  2. 在项目目录下创建 .pro 文件(若使用qmake):
    QT += widgets
    SOURCES = main.cpp
    TARGET = button_demo
  3. 执行以下命令编译:
    qmake
    make
  4. 运行程序:
    ./button_demo

若使用CMake,则创建 CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(button_demo)
find_package(Qt6 REQUIRED COMPONENTS Widgets)
qt_standard_project_setup()
qt_add_executable(button_demo main.cpp)
target_link_libraries(button_demo Qt6::Widgets)

然后执行 cmake . && make && ./button_demo。

验证方法

程序启动后,窗口显示标签“Hello World”和按钮“Click Me”。点击按钮一次,标签变为“Button Clicked”;再次点击,标签恢复为“Hello World”。每次点击按钮,标签文本都在两个值之间切换,说明信号与槽连接成功。

信号与槽连接示意 QPushButton clicked() QLabel setText() connect 点击按钮 → 发射clicked信号 → 触发槽函数切换文本

关键说明

  • connect 函数将按钮的 clicked 信号连接到窗口的 onButtonClicked 槽函数,这是Qt信号与槽机制的核心用法。
  • 代码末尾的 #include "main.moc" 是qmake编译时处理 Q_OBJECT 宏所必需的;若使用CMake的 qt_standard_project_setup(),该行可省略。
  • 槽函数中通过条件判断实现文本切换,展示了如何在槽中访问和修改界面控件。