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 编辑完成(焦点离开)
相关推荐
ModStart1 小时前
通知:两个致命紧急PHP漏洞需要修改
后端
高频因子挖掘机1 小时前
A股量化第一步:如何利用 QuantDash 实现日K数据清洗、前复权校验与缺失值处理
后端·github·api
张彦峰ZYF2 小时前
借与还之间:连接池设计的技术难点与实现推演
后端·架构·连接池·服务端与协议·无锁借还与尾延迟·失效模式与探活时机·状态污染与泄漏检测
LEE2 小时前
为什么你的 Claude Code 还在转圈等,别人的已经干完三件事了?
前端·后端·ai编程
金色熊族2 小时前
在Qt中使用asan检测内存泄漏(一)
linux·qt·asan
前行中的小猪2 小时前
Qt 5 踩坑实录:多显示器跨屏拖拽导致窗口异常放大与 setGeometry 报错的深度解析与根治
qt·多显示器·高分辨率·多屏幕
喵个咪2 小时前
GoWind CMS 拆解:给 NL2SQL 上四把锁——智能问数的安全边界
后端
喵个咪2 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
后端·go·cms
不像程序员的程序媛2 小时前
springboot支持的web容器
前端·spring boot·后端
喵个咪2 小时前
GoWind Admin 拆解:一个 Sender 接口接 39 个通知渠道
后端·架构·go