1 跨界面发送信号
1.1 例子
目标实现这样的功能:一个界面显示数字,另外一个界面有按钮,按一下之后数字加1。
1.2 界面效果
一个QLineEdit显示数字
打开弹窗之后,按下自增键,主窗口显示数字会加1
1.3 总体思路
按下主窗口按钮,会出现子窗口:只需要让按钮绑定槽函数,在槽函数中创建一个子窗口对象并让其显示即可
按下子窗口”自增“按钮,父窗口数字加1:自定义一个信号value_add,"自增"按钮按下,就发送信号。同时将此信号与父窗口的handle_value_add函数绑定,该函数负责更新QLineEdit中的值。
父窗口更新value后,同时发送自定义信号send_value,将value值发送,同时将子窗口与该信号绑定,以便于子窗口更新它的value值
1.4 添加一个新界面
点击项目->右键->添加新文件->Qt->Qt设计器界面类->确定
选择没有多余控件的界面。
随便起一个名字
点击确定完成创建
UI界面添加一个按钮即可。
1.5 自定义信号
- 使用
signals
声明 - 返回值是
void
,只需要声明,不需要实现 - 在需要发送的地方使用:
emit 信号名字(参数);
进行发送 - 在需要链接的地方使用
connect
进行链接 - 可以有参数,可以重载
1.6 槽函数
- 5.4版本以下,必须要写到Public slots下。高级版本下,既可以写到public slots,也可以写到全局下。
- 返回值是void,需要声明也需要实现
- 可以由参数,可以发生重载
1.7 详细代码
项目代码下载链接:提取码:ikun
注意:子窗口发送信号的函数中参数列表必须与父窗口接受信号的槽函数中参数列表保持一致。否则会接受不到,导致错误
(Qt Creator中自动生成的代码就没有全部写上来了)
manwindow.h
class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); void handle_value_add(int value); //处理value加一的信号的槽函数。这类函数不需要定义在public slots中 signals: //信号都需要定义在signals中 void send_value(int value); //将value值发送给子窗口的信号 public slots: void on_btnOpen_clicked(); //槽函数,也就是只依据函数名就自动实现绑定、无须手动实现的函数,必须要定义在public slots里面。UI中按钮控件为btnOpen private: Ui::MainWindow *ui; };
mainwindow.cpp
void MainWindow::handle_value_add(int value){ //让value值显示在界面上 this->ui->lineEdit->setText(QString::number(value)); int val = this->ui->lineEdit->text().toInt(); emit this->send_value(val); } void MainWindow::on_btnOpen_clicked(){ //注意这个事件不要写成on_btnOpen_click() setDialog *setWindow = new setDialog(this); //弹窗对象,填上this之后,该对象就和主窗口在同一个对象树上,可以由系统自动实现空间回收等 int value = this->ui->lineEdit->text().toInt(); //获取初始值,并转换为int数值类型 setWindow->set_value(value); //将子窗口的初始值设置为上面显示的 //将子窗口的信号函数绑定 //当MainWindow发送send_value信号时,setWindow对象的handle_send_value会运行 connect(this,&MainWindow::send_value,setWindow,&setDialog::handle_send_value); //当sewtWindow发送value_add信号时,mainwddow对象的handle_value_add会运行 connect(setWindow,&setDialog::value_add,this,&MainWindow::handle_value_add); setWindow->exec(); //窗口事件循环,相当于显示窗口。会阻塞代码的执行 }
setWindow.h
class setDialog : public QDialog { Q_OBJECT public: explicit setDialog(QWidget *parent = nullptr); ~setDialog(); void set_value(int value); //设置value int get_value(); void handle_send_value(int value); //子窗口处理父窗口发送value的信号的槽函数 private slots: void on_btnAdd_clicked(); //子窗口按钮被按下的槽函数 signals: //自定义信号,写到signals下。value+1的信号是由子窗口发出的,当然要写在子窗口的头文件中 void value_add(int value); private: int value; Ui::setDialog *ui; };
setWindow.cpp
void setDialog::on_btnAdd_clicked(){ //ui中按钮控件名为btnAdd //按下按钮,就发送信号 int val = this->get_value(); val++; emit this->value_add(val); } void setDialog::handle_send_value(int value){ //父窗口发送,则把自己的value设为父窗口lineEdit中的值 //如果不更新value,那么子窗口发送给父窗口的value会一直是一样的 this->set_value(value); } void setDialog::set_value(int value){ this->value = value; //设置value值 } int setDialog::get_value(){ return this->value; }
2 总结
在代码的舞台上翩翩起舞, Qt,如诗如画,编织梦的彩虹。
跨越平台的轻盈舞姿, 文档的琴音,灵感的涟漪。
模块的花瓣,细腻而丰满, 开发者的心灵,在那里盛开。
清新而深邃,如林中明月, Qt,用优雅的笔触,谱写未来的篇章。
渴望挑战Qt的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多Qt的奇迹吧。我们推出了引领趋势的💻QT专栏:《QT从基础到进阶》 ,旨在深度探索Qt的实际应用和创新。🌐🔍