You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:31:17