终于解决了这个问题!这才怀着激动的心情跑来记录一下。你们是不知道这其中的艰辛啊,太难了,差亿点就放弃学Qt了……
此处苦水省略一万字……
关于子窗口向父窗口传值的方法,在网上搜了不下百遍,免费的、付费下载、会员限看的文章都琢磨很久仍一无所获,倒是耐心见长。最后自己一点点摸索,搞懂原理之后就顺利解决了。果然,靠天靠地不如靠自己!
我的方法是通过信号和槽的机制来实现,大概分为如下4步:
- 在子窗口中定义一个信号,用于向父窗口传递数据。
- 在子窗口中定义一个槽函数,用于接收父窗口传递过来的数据。
- 在父窗口中创建子窗口对象,并连接子窗口的信号和父窗口的槽函数。
- 在子窗口中触发信号,将数据传递给父窗口。
因为是讲方法,所以案例就做的比较简单。主窗口上我在设计界面提前放了一个lineedit控件和一个pushbutton控件。lineedit控件用于显示子窗口中的控件传来的值,pushbutton控件用于弹出子窗口。如下图所示:
子窗口也是一个lineedit控件和一个pushbutton控件。lineedit控件给用户输入值,然后点击旁边pushbutton控件发送到主窗口的lineedit控件中,并显示出来。子窗口设计界面如下图所示:
下面我把需要写的代码直接在代码片段中贴出来,不然不了解的小伙伴可能看的有点迷糊。要写代码或者要修改的地方如下代码块中所示,其他自动生成的代码就没贴出来了,还是看不懂的可以翻到文章最底部的完整代码。
主窗口头文件代码中(mainwindow.h):
//要包含一下子窗口的头文件
#include <dialog.h>
private slots:
//“弹出子窗口”按钮的槽函数声明
void on_pushButton_clicked();
//接收子窗口值的槽函数声明
void recevData(QString data);
private:
Ui::MainWindow *ui;
//初始化子窗口(这里不知道有什么用,姑且这么叫吧~)
Dialog *dlg;
主窗口cpp代码中(mainwindow.cpp):
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化子窗口(2)
dlg = new Dialog();
connect(dlg, &Dialog::sendData, this, &MainWindow::recevData);
}
//“弹出子窗口”按钮实现
void MainWindow::on_pushButton_clicked()
{
dlg->show();
}
//接收子窗口值的函数实现
void MainWindow::recevData(QString data)
{
ui->lineEdit->setText(data);
}
子窗口头文件代码中(dialog.h):
private slots:
//“发送”按钮的槽函数声明
void on_pushButton_clicked();
//用于发送数据的sendData的信号
signals:
void sendData(QString data);
子窗口cpp文件代码中(dialog.cpp):
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//connect连接“发送”按钮
connect(ui->pushButton, &QPushButton::clicked, this, &Dialog::on_pushButton_clicked);
}
//“发送”按钮实现:
void Dialog::on_pushButton_clicked()
{
QString data = ui->lineEdit->text();
emit sendData(data);
}
要看源文件所有代码的小伙伴直接下载这篇文章关联的资源文件就行,还有不清楚的可以在评论留言哈,我看到会第一时间回复的哦~
如果对你有帮助,点个小赞就行哈~ 感谢感谢~
对了,我的项目文件结构如下,用的是Qt_6_2_4_MinGW_64_bit-Debug。
2023.11.1 新增内容:
昨天分享的是子窗口单个控件传值到父窗口,这里再补充一个子窗口多控件传值到父窗口。直接贴上完美运行的源代码文件压缩包,需要的小伙伴自己下载哈~
Tips:代码中有注释的地方就是要写的或者要修改的地方,没有注释的地方就是没有动过的,小伙伴们就只需要看有注释的地方的代码就好啦~