4.信号与槽

1.点击确定按钮实现确定效果

1.1点击效果操作

1.2.在widget.h中多了一个信号

1.3.在widget.cpp中多了一个槽函数

1.4.补全槽函数

js 复制代码
#include <QProcess>

void Widget::on_commitButton_clicked()  
{  
    // 获取lineedit数据
    QString program = ui->cmdLineEdit->text();  
    
    //创建process对象
    QProcess *myProcess = new QProcess(this);  
    myProcess->start(program);  
}

1. #include <QProcess>

  • 这行代码引入了Qt的QProcess类头文件。

  • QProcess用于在Qt程序中启动和管理外部进程(比如运行一个命令行程序、脚本等)。

2. void Widget::on_commitButton_clicked()

  • 这是一个槽函数,通常和按钮的点击信号(比如commitButton的clicked()信号)连接。

  • 当用户点击"确定"按钮时,这个函数会被自动调用。

3. QString program = ui->cmdLineEdit->text();

  • 从界面上的cmdLineEdit文本框获取用户输入的命令或程序路径。

  • 例如,用户输入notepad,program变量就会是"notepad"。

4. QProcess *myProcess = new QProcess(this);

  • 创建一个QProcess对象,用于启动和管理外部进程。

  • this表示以当前窗口为父对象,Qt会自动管理内存。

5. myProcess->start(program);

  • 启动外部程序,参数是用户输入的命令。

  • 例如,用户输入notepad,就会打开记事本程序。

2.回车实现确定效果

2.1字符串宏的方法实现

js 复制代码
//连接信号与槽  谁发出信号  发出什么信号  谁处理信号  怎么处理信号  
connect(ui->cmdLineEdit, SIGNAL(returnPressed()), this, SLOT(on_commitButton_clicked()));

1. 谁发出信号

发出者ui->cmdLineEdit(行编辑框控件)

2. 发出什么信号

信号SIGNAL(returnPressed())(按下回车键的信号)

3. 谁处理信号

处理者this(当前 Widget 对象)

4. 怎么处理信号

处理方式SLOT(on_commitButton_clicked())(直接调用 commitButton 的点击槽函数)

当用户在文本输入框中按下回车键时,就自动执行点击确定按钮时要做的事情

2.2函数指针/取地址的方法实现

js 复制代码
connect(ui->cmdLineEdit, &QLineEdit::returnPressed, this, &Widget::on_commitButton_clicked);

1. 谁发出信号

发出者ui->cmdLineEdit(行编辑框控件)

2. 发出什么信号

信号&QLineEdit::returnPressed(按下回车键的信号)

3. 谁处理信号

处理者this(当前 Widget 对象)

4. 怎么处理信号

处理方式&Widget::on_commitButton_clicked(直接调用 commitButton 的点击槽函数)

2.3字符串宏与函数指针两者对比

1. 发出什么信号

信号

  • 新式语法&QLineEdit::returnPressed(按下回车键的信号)
  • 旧式语法SIGNAL(returnPressed())(功能相同,但用宏表示)

2. 怎么处理信号

处理方式

  • 新式语法&Widget::on_commitButton_clicked(直接调用 commitButton 的点击槽函数)
  • 旧式语法SLOT(on_commitButton_clicked())(效果相同,但用宏表示)

3.对比总结

方式 写法 检查时机 是否推荐 备注
字符串宏(旧式) SIGNAL(clicked()), SLOT(...) 运行时 ❌ 旧代码兼容使用 容易拼写错误
函数指针(新式) &QLineEdit::returnPressed, &Widget::on_commitButton_clicked 编译时 ✅ 推荐

3.点击取消按钮实现关闭效果

3.1.在widget.h中声明槽函数

js 复制代码
private slots:  
    void on_cancalButton_clicked();
  • private slots:

这是Qt的槽函数声明区域,表示下面的函数是私有槽函数,只能在类内部被信号触发。

  • void on_cancalButton_clicked();

声明一个槽函数,名字通常和按钮的对象名+_clicked信号自动匹配(如果用Qt Designer自动生成的代码就是这样命名的)。这个函数将在"取消"按钮被点击时自动调用。

3.2.在widget.cpp中实现槽函数

js 复制代码
void Widget::on_cancalButton_clicked()  
{  
    this->close();  
}
  • void Widget::on_cancalButton_clicked()

这是槽函数的实现部分,属于Widget类。

  • this->close();

this指当前窗口对象,close()是QWidget的成员函数,作用是关闭当前窗口。

3.3.连接信号与槽

1字符串宏的方法实现

js 复制代码
connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(on_cancalButton_clicked()));

2.函数指针/取地址的方法实现

js 复制代码
connect(ui->cancalButton,&QPushButton::clicked,this,&Widget::on_cancalButton_clicked);

4.点击浏览按钮实现QMessageBox效果

4.1.在widget.h中声明槽函数

csharp 复制代码
private slots:
    void on_browseButton_clicked();  // 浏览按钮点击槽函数

4.2.在widget.cpp中实现槽函数

arduino 复制代码
// 槽函数实现
void Widget::on_browseButton_clicked() {
    QMessageBox::information(this, 
                           "提示", 
                           "您点击了浏览按钮",);
}

4.3.连接信号与槽

1.字符串宏的方法实现

js 复制代码
connect(ui->browseButton,SIGNAL(clicked()),this,SLOT(on_browseButton_clicked()));

2.函数指针/取地址的方法实现

js 复制代码
connect(ui->browseButton, &QPushButton::clicked, this, &Widget::on_browseButton_clicked);

3.lambda表达式

js 复制代码
connect(ui->browseButton, &QPushButton::clicked, [this]() 
{
    QMessageBox::information(this, "信息", "您点击了浏览按钮");
});

5.QLineEdit和QPushButton 两者对比

在QLineEdit中按下Enter键,用的信号为returnPressed

在QPushButton中鼠标点击,用的信号为clicked

总结

信号 适用控件 触发条件
returnPressed QLineEdit 按下 Enter/Return
clicked QPushButtonQCheckBox 鼠标点击
textChanged QLineEdit 文本内容变化
editingFinished QLineEdit 编辑完成(焦点离开)
相关推荐
崎岖Qiu1 小时前
【JVM篇11】:分代回收与GC回收范围的分类详解
java·jvm·后端·面试
钱彬 (Qian Bin)3 小时前
《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——8. AI赋能(下):在Qt中部署YOLOv8模型
人工智能·qt·yolo·qml·qt quick·工业质检·螺丝瑕疵检测
许苑向上3 小时前
Spring Boot 自动装配底层源码实现详解
java·spring boot·后端
超级小忍5 小时前
深入浅出:在 Spring Boot 中构建实时应用 - 全面掌握 WebSocket
spring boot·后端·websocket
没有bug.的程序员6 小时前
《Spring Security源码深度剖析:Filter链与权限控制模型》
java·后端·spring·security·filter·权限控制
无责任此方_修行中6 小时前
不止是 AI 热潮:AWS 2025 技术峰会带给我的思考
后端·架构·aws
lang201509287 小时前
Apache Ignite 与 Spring Boot 集成
spring boot·后端·apache·ignite
Asthenia04127 小时前
深入剖析 Spring Boot 请求处理链路与 Servlet 的本质
后端
旧时光巷7 小时前
【Flask 基础 ①】 | 路由、参数与模板渲染
后端·python·零基础·flask·web·模板渲染·路由系统
小醉你真好7 小时前
Spring Boot 数据源配置中为什么可以不用写 driver-class-name
spring boot·后端·源代码管理