Qt C++中如何将Dialog UI参数传递至MainWindow UI?
Qt中Dialog向MainWindow传递数据的信号槽连接问题
我有两个UI界面:MainWindow和Dialog,希望将Dialog中的文本内容传递到MainWindow的列表控件中。尝试了两种实现方式,但信号连接部分存在问题,不清楚如何正确连接信号与槽来实现数据传递。
第一种实现尝试(MainWindow.cpp)
void MainWindow::on_ok_cancel_accepted() { if (add) { std::unique_ptr<rsu> baz(new rsu); baz->id = uid->ID->text().toStdString(); baz->name = uid->Name->text().toStdString(); baz->coorx = uid->CoorX->text().toFloat(); baz->coory = uid->CoorY->text().toFloat(); baz->ip = uid->IP->text().toStdString(); baz->port = uid->Port->text().toInt(); r.push_back(*baz); rsuitem = new QListWidgetItem(QString::fromUtf8(baz->name.c_str()),ui->listRSU); rsuitem->setFlags(rsuitem->flags() | Qt::ItemIsUserCheckable); rsuitem->setCheckState(Qt::Unchecked); clear_all(); uid->rsuWidget->hide(); } else { //QListWidgetItem *it = ui->listRSU->takeItem(itSelected); for (unsigned long i=0 ; i< r.size(); i++) { if (r[i].name == ui->Name->text().toStdString()) { r[i].id = uid->ID->text().toStdString(); r[i].name = uid->Name->text().toStdString(); r[i].coorx = uid->CoorX->text().toFloat(); r[i].coory = uid->CoorY->text().toFloat(); r[i].ip = uid->IP->text().toStdString(); r[i].port = uid->Port->text().toInt(); } } rsuitem = new QListWidgetItem(uid->Name->text(),ui->listRSU); rsuitem->setFlags(rsuitem->flags() | Qt::ItemIsUserCheckable); rsuitem->setCheckState(Qt::Unchecked); uid->rsuWidget->hide(); } enable_all(); }
注:其中uid指向Dialog实例,ui指向MainWindow的UI对象。
第二种实现尝试(MainWindow.cpp)
void MainWindow::acceptedbutton() { if (add) { std::unique_ptr<rsu> baz(new rsu); baz->id = uid->ID->text().toStdString(); baz->name = uid->Name->text().toStdString(); baz->coorx = uid->CoorX->text().toFloat(); baz->coory = uid->CoorY->text().toFloat(); baz->ip = uid->IP->text().toStdString(); baz->port = uid->Port->text().toInt(); r.push_back(*baz); rsuitem = new QListWidgetItem(QString::fromUtf8(baz->name.c_str()),ui->listRSU); rsuitem->setFlags(rsuitem->flags() | Qt::ItemIsUserCheckable); rsuitem->setCheckState(Qt::Unchecked); clear_all(); uid->rsuWidget->hide(); } else { //QListWidgetItem *it = ui->listRSU->takeItem(itSelected); for (unsigned long i=0 ; i< r.size(); i++) { if (r[i].name == ui->Name->text().toStdString()) { r[i].id = uid->ID->text().toStdString(); r[i].name = uid->Name->text().toStdString(); r[i].coorx = uid->CoorX->text().toFloat(); r[i].coory = uid->CoorY->text().toFloat(); r[i].ip = uid->IP->text().toStdString(); r[i].port = uid->Port->text().toInt(); } } rsuitem = new QListWidgetItem(uid->Name->text(),ui->listRSU); rsuitem->setFlags(rsuitem->flags() | Qt::ItemIsUserCheckable); rsuitem->setCheckState(Qt::Unchecked); uid->rsuWidget->hide(); } enable_all(); }
尝试的信号连接代码
connect(dia, SIGNAL(accepted()), this, SLOT((acceptedbutton())));
注:dia是Dialog实例,槽函数acceptedbutton()已在MainWindow.h中声明。
问题分析与解决方法
1. 修复信号连接语法错误
你写的槽函数部分多了一对冗余括号,正确的旧版信号槽语法应为:
connect(dia, SIGNAL(accepted()), this, SLOT(acceptedbutton()));
如果使用Qt5及以上版本,更推荐类型安全的新信号槽语法,编译期就能发现错误:
connect(dia, &QDialog::accepted, this, &MainWindow::acceptedbutton);
2. 优化数据传递方式
避免直接访问Dialog的控件(如
uid->ID),可在Dialog类中添加数据获取接口,降低耦合:// Dialog类中新增成员函数 QString getID() const { return ID->text(); } QString getName() const { return Name->text(); } float getCoorX() const { return CoorX->text().toFloat(); } // 其他字段对应的获取函数...之后在MainWindow的槽函数中调用这些接口获取数据即可。
编辑场景修复:当前代码会新增列表项而非修改原有项,可先移除选中项再添加,或直接修改选中项内容:
// 编辑分支优化示例 QListWidgetItem* selectedItem = ui->listRSU->currentItem(); if (selectedItem) { selectedItem->setText(uid->Name->text()); // 同步更新数据容器r中的对应项 for (auto& item : r) { if (item.name == selectedItem->text().toStdString()) { item.id = uid->ID->text().toStdString(); // 其他字段更新... break; } } }
3. 确保信号正确触发
如果是用QDialog::exec()显示对话框,点击默认OK按钮会自动触发accepted()信号;如果是自定义按钮,需在按钮的点击槽中手动调用accept()来触发信号。
内容的提问来源于stack exchange,提问作者Mete Korucu
相关产品推荐
相关产品推荐

