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 编辑完成(焦点离开)
相关推荐
追逐时光者3 小时前
一款使用 C# 编写专为 Windows 11 打造的文件资源管理器增强工具!
后端·.net
风象南3 小时前
普通人用AI加持赚到的第一个100块
人工智能·后端
冰_河5 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
JavaGuide8 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
桦说编程8 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
格砸9 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
蝎子莱莱爱打怪10 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
哈密瓜的眉毛美10 小时前
零基础学Java|第三篇:DOS 命令、转义字符、注释与代码规范
后端
用户605723748730810 小时前
AI 编码助手的规范驱动开发 - OpenSpec 初探
前端·后端·程序员