首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QDialog C++:将信息从QDialog传递给MainWindow

QDialog C++:将信息从QDialog传递给MainWindow
EN

Stack Overflow用户
提问于 2022-06-12 11:19:54
回答 1查看 95关注 0票数 1

我试图用以下内容制作一个程序:在MainWindow (QMainWindow)中,我有一个按钮AddUser,它打开一个辅助窗口(QDialog),在该窗口中,我有3个空格来编写要添加到程序中的名称、电子邮件和移动用户号码。我希望,在介绍了所有这些信息之后,我单击Add按钮,窗口关闭,我编写的信息将传递给位于MainWindow中的用户向量(向量用户),这样我就可以使用它了。我已经把所有的事情都做好了,只是那些我不能做的传递信息。我已经搜索过了,但是我刚刚找到了一个登录窗口(次要窗口在主窗口之前打开,在介绍数据之后,它关闭登录窗口并打开主窗口,保存这些信息)。我希望基本上是这样,但区别是当我单击MainWindow中的一个按钮时,第二个窗口就会打开。

但效果不太好有人能帮我吗?

我有以下代码(基于Login上下文代码):

adduserwindow.h (辅助窗口)

代码语言:javascript
运行
复制
signals:
   void add(const User & user);

adduserwindow.cpp

代码语言:javascript
运行
复制
void AddUserWindow::on_button_addUser_clicked() // Add button after write the info
{
    QString name = ui->text_name->text();
    QString email = ui->text_email->text();
    QString mobile = ui->text_mobile->text();
    User u1(name.toStdString(),email.toStdString(),mobile.toStdString());
    users_.push_back(u1);
    emit add(u1); 
}

mainwindow.h

代码语言:javascript
运行
复制
public:
    void setUser(const User &user);

private:
    User mUser;

mainwindow.cpp

代码语言:javascript
运行
复制
void MainWindow::on_button_adduser_clicked() // AddUser button in MainWindow
{
    AddUserWindow adduser_window(this);
    adduser_window.exec();
    QObject::connect(&adduser_window, &AddUserWindow::add, [this](const User user) {
       this->setUser(user);
       this->show();
    });
}

void MainWindow::setUser(const User& user)
{
    mUser = user;
    qDebug()<<mUser.toString(); //toString() is a method of User class to convert std::string to QString
}

我在User.h的末尾有这个:

代码语言:javascript
运行
复制
Q_DECLARE_METATYPE(User)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-13 23:07:49

给未来的访客留个答案..。这里的问题是,在用户关闭对话框之前,QDialog的exec()函数不会返回。在这种情况下,简单的解决方案是在调用exec()之前进行任何信号连接。

但是,它的文档建议使用open(),或者为无模式对话框使用show()。这些函数都会立即返回,因此需要将对话框的生存期绑定到它的父窗口,方法是给它动态存储持续时间:

代码语言:javascript
运行
复制
void MainWindow::on_button_adduser_clicked() // AddUser button in MainWindow
{
    auto* adduser_window = new AddUserWindow(this);
    QObject::connect(adduser_window, &AddUserWindow::add, [this](const User user) {
       this->setUser(user);
       this->show();
    });
    adduser_window.open();
}

这是一种惯用的Qt方式,我建议这样做,因为无论对话框(或其他QObject)实际是否会超过该函数,它都能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72591704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档