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 QPushButton、QCheckBox 等 鼠标点击
textChanged QLineEdit 文本内容变化
editingFinished QLineEdit 编辑完成(焦点离开)
相关推荐
我不会起名字32236 分钟前
seq 空洞排查:Mongo 的 51 只是预留上界,Redis CURR 才是已消耗边界
redis·后端·mongodb·go·即时通讯·im·故障排查
特立独行的猫A36 分钟前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python
学长毕设1 小时前
基于SpringBoot的高校后勤报修管理系统-附源码
java·spring boot·后端
特立独行的猫A1 小时前
cj-tauri vs Rust/Tauri 同款播放器实测:编译 21 秒 vs 11 分钟,磁盘 12 MB vs 1.2 GB
java·后端·python
乐橙开放平台1 小时前
海康和大华摄像头能统一管理吗?可以通过 GB28181 或视频融合平台接入
网络·后端·物联网·音视频
一条Go5 小时前
OnCall 时段路由:跨午夜、左闭右开与「Local 不是时区」
后端·架构·github
Moment5 小时前
不会后期的我,发现了一个开源胶片神器😍😍😍
前端·后端·开源
数据库小学妹5 小时前
pgbouncer 事务池:prepared statement、临时表与会话状态
数据库·后端·postgresql
三小河5 小时前
SWC 凭什么比 Babel 快 ?项目优化迁移踩坑记录
前端·后端
鶴哥只手遮天6 小时前
《Redis 8.10.3 深度剖析》系列 ·第 17 章. 一个迟到十六年的类型
redis·后端·开源