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 编辑完成(焦点离开)
相关推荐
极客悟道7 分钟前
巧解 Docker 镜像拉取难题:无需梯子和服务器,拉取数量无限制
后端·github
aiopencode26 分钟前
iOS 出海 App 安全加固指南:无源码环境下的 IPA 加固与防破解方法
后端
liangdabiao31 分钟前
AI一人公司?先搞定聚合支付!一天搞定全能的聚合支付系统
后端
AillemaC36 分钟前
三分钟看懂回调函数
后端
yeyong38 分钟前
越学越糟心,今天遇到又一种新的服务控制方式 snap,用它来跑snmpd
后端
喷火龙8号40 分钟前
深入理解MSC架构:现代前后端分离项目的最佳实践
后端·架构
Java技术小馆1 小时前
GitDiagram如何让你的GitHub项目可视化
java·后端·面试
星星电灯猴2 小时前
iOS 性能调试全流程:从 Demo 到产品化的小团队实战经验
后端
程序无bug2 小时前
手写Spring框架
java·后端
JohnYan2 小时前
模板+数据的文档生成技术方案设计和实现
javascript·后端·架构