按键QPushButton设置信号与槽的四种方式

本文介绍了在Qt开发中使用QtDesigner、QObject::connect、Lambda表达式和函数指针四种方式来自动连接信号与槽,以及它们各自的优缺点和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种方式:自动连接(使用UI文件)

在使用Qt Designer时,可以通过命名约定自动连接信号和槽。当UI文件加载时,以on__ 命名的槽会自动连接到相应的信号。

具体做法:
在这里插入图片描述
然后右键按钮转到槽
在这里插入图片描述
点击ok,会跳转到代码中,同时会帮你定义好 on_pushButton_clicked() 方法
在这里插入图片描述

第二种方式:使用QObject::connect

最常用的方式,直接通过QObject::connect 函数连接信号和槽。
在这里插入图片描述
第二步需要在构造函数中初始化绑定
在这里插入图片描述
如果 ui-> 找不到 btncon ,则需要重新构建一下项目(ctrl + B)

头文件中,声明一下槽函数
在这里插入图片描述
最后在cpp文件中实现这个槽函数
在这里插入图片描述
在这里插入图片描述

第三种方式:使用C++11Lambda表达式

利用C++11引入的Lambda表达式进行信号与槽的连接。这种方式可以直接在连接点使用匿名函数,使代码更加简洁。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第四种方式:使用函数指针

Qt 5中引入,允许使用函数指针直接连接信号和槽,这种方式类型安全,且可以利用IDE的代码补全和错误检查。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这些方式各有优劣,选择哪种方式取决于具体的应用场景、代码风格以及个人偏好。

例如,直接使用 QObject::connect 是最通用的方式,而使用Lambda表达式可以在同一位置编写信号处理逻辑,提高代码的可读性。使用函数指针的方式则在编译时提供更好的类型检查。自动连接通常在使用Qt Designer设计UI时比较方便。

完整代码如下

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <iostream>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_btnUi_clicked();
    void on_btnCon_clickedMyself();
    void on_fortch_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 在构造函数中,进行信号与槽的绑定
    // 第二种方式:QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
    QObject::connect(ui->btnCon, SIGNAL(clicked()), this, SLOT(on_btnCon_clickedMyself()));

    // 第三种方式:Lambda表达式:QObject:: connect(sender, &Sender::signal, [=]() {/* lambda body */ });
    QObject::connect(ui->btnLambda, &QPushButton::clicked, [=](){
        std::cout << "btnLamdaClicked" << std::endl;
    });

    // 第四种方式 QObject::connect(sender, &Sender::signal, receiver, &Receiver::slot);
    QObject::connect(ui->btnFortch, &QPushButton::clicked, this, &Widget::on_fortch_clicked);
}

Widget::~Widget()
{
    delete ui;
}

// 第一种方式:通过uiDesigner
void Widget::on_btnUi_clicked()
{
    std::cout << "uiBtnClick" << std::endl;
}

void Widget::on_btnCon_clickedMyself()
{
    std::cout << "btnConClicked" << std::endl;
}

void Widget::on_fortch_clicked()
{
    std::cout << "btnFortchClicked" << std::endl;
}

### Qt 使用信号实现界面切换 #### 创建项目结构 为了展示如何通过信号机制实现在不同窗口之间的切换,首先需要构建基本的应用程序框架。这通常涉及创建一个新的Qt Widgets应用程序并定义多个`QWidget`子类作为不同的页面。 #### 添加新的 Widget 页面 除了默认生成的主要窗口外,还需要额外添加至少一个用于表示第二个页面的新 `QWidget` 或者继承自其他更具体的控件如 `QDialog`, `QMainWindow` 等[^1]。 #### 设计 UI 和交互组件 对于每一个页面,在其对应的 `.ui` 文件里布置好所需的布局以及触发导航动作的按钮等可视化元素;同时也要确保这些部件被正确地连接到了各自的事件处理器上以便响应用户的操作输入[^2]。 #### 定义信号函数 在源代码层面,则是在各个页面类内部声明特定用途的 C++ 成员方法 —— 即所谓的 “slot”,它们可以接收来自界面上发生的各种类型的事件通知 (即 "signal") 并执行相应的业务逻辑处理流程。例如: ```cpp // bmainwindow.h #ifndef BMAINWINDOW_H #define BMAINWINDOW_H #include <QMainWindow> namespace Ui { class BMainWindow; } class BMainWindow : public QMainWindow { Q_OBJECT public: explicit BMainWindow(QWidget *parent = nullptr); ~BMainWindow(); signals: void switchToPageTwo(); // 自定义信号 private slots: void handleButtonClicked(); // 函数 private: Ui::BMainWindow *ui; }; #endif // BMAINWINDOW_H ``` 这里展示了在一个名为 `BMainWindow` 的类中定义了一个叫做 `switchToPageTwo()` 的信号用来告知外部想要跳转至另一个页面的需求,而当某个按钮被按下时就会调用关联好的私有成员函数 `handleButtonClicked()` 来完成实际的任务转换工作。 #### 连接信号 最后一步就是建立起两者间的联系关系了。可以在构造器里面利用宏表达式形式或者更加直观易懂的传统语法风格来进行配对设置: ```cpp connect(button, SIGNAL(clicked()), this, SLOT(handleButtonClicked())); // 或者使用现代C++ lambda表达式的写法 connect(button, &QPushButton::clicked, [=]() { emit switchToPageTwo(); }); ``` 上述例子说明了怎样把按压指定按键的动作映射成发出请求变更视图的通知给监听方知道,从而达到控制流导向的目的[^3]。 #### 主要代码片段 下面给出一段简化版的核心部分伪代码供参考理解整个过程的工作原理: ```cpp // mainwindow.cpp void MainWindow::setupUi() { secondWindow = new SecondWindow(this); connect(ui->pushButton, &QPushButton::clicked, [this]() { showSecondWindow(); }); connect(secondWindow, &SecondWindow::backRequested, this, &MainWindow::showNormal); } void MainWindow::showSecondWindow() { hide(); secondWindow->show(); } ``` 这段代码实现了点击第一个窗口中的按钮后隐藏当前窗口并显示第二个窗口的效果,并且还设置了返回按钮的功能以允许用户回到初始状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值