将变量值从 QDialog 发送到 QMainwindow 函数

Send Variable values from QDialog to QMainwindow function

我的 UI MainWindow 有一个 QListWidget,点击它的项目时,必须弹出一个相应的 QDialog 框,提示用户在 QDialog 框中输入一些值,输入的值 line_edits 的 QDialog 框必须存储到一个 QString 变量中,这个变量在 MainWindow 的函数中应该是 accessed/used,

例如:我有一个 QListWidget,其中包含 3 个项目“纽约”、“格拉斯哥”、“孟买”,当我双击名为“纽约”的项目时,会弹出一个窗口询问我这个

在我输入 3 和 Hilton 之后,QListWidget 中最初为“New York”的项目必须更改为 “纽约-3,安全屋在希尔顿” 我的 MainWindow.cpp 代码是

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCore>
#include <QtGui>
#include <sstream>
#include <QtWidgets/qmessagebox.h>
#include <QtWidgets/qlistwidget.h>

using namespace std;

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->My_listwidget->addItem("New York");
    ui->My_listwidget->addItem("Glasgow");
    ui->My_listwidget->addItem("Mumbai");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_My_listwidget_itemDoubleClicked(QListWidgetItem* item)
{
    QString test = item->text();
    std::string test_s = test.toStdString();

    if (test_s.find("New York") != std::string::npos) // check if item contains text "New York"
    {
        WinApp winApp;
        winApp.setModal(true);   //Displaying the window here
        winApp.exec();
    }
    
    if (test_s.find("Glasgow") != std::string::npos) 
    {
    // show another dialog box asking some questions
    }
    if (test_s.find("Mumbai") != std::string::npos) 
    {
    // show another dialog box asking some questions
    }
}

我的代码 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets/QMainWindow>
#include "ExecutionContext.h"
#include <QtWidgets/qlistwidget.h>
//#include "secdialog.h"
#include <qregexp.h>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{

    Q_OBJECT                      //Used to handle events

public:
    MainWindow(QWidget* parent = 0);
    ~MainWindow();                    //Destructor used to free resources

private slots:

    void on_xml_scripts_textbox_itemDoubleClicked(QListWidgetItem* item);

    Ui::MainWindow* ui; // pointing to UI class

private:

};
#endif // MAINWINDOW_H

我的 WinApp.h 代码,winapp 是我的对话框的名称

#include <QtWidgets/qdialog.h>
#include "ui_WinApp.h"

class WinApp : public QDialog, public Ui::WinApp
{
    Q_OBJECT

public:
    WinApp(QWidget *parent = Q_NULLPTR);
    ~WinApp();

private slots:

private:
    Ui::WinApp ui;
};

WinApp.cpp

#include "WinApp.h"

WinApp::WinApp(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);
}

WinApp::~WinApp()
{
}

让启动 QDialog 对象的函数在构造函数中传递 QString 参数并覆盖 accept().

#include <QtWidgets/qdialog.h>
#include "ui_WinApp.h"

class WinApp : public QDialog, public Ui::WinApp
{
    Q_OBJECT

public:
    WinApp(QString& stringToModify, QWidget *parent = Q_NULLPTR);
    ~WinApp();

private slots:
void accept() override;
private:
    Ui::WinApp ui;
};

并定义 acccept() 插槽,它将从 lineEdit 获取 QString 并用它更新 stringToModify。

void WinApp::accept(){
//do stuff with QString
this->close();
}

你需要在 WinApp 对话框中添加 class 测试 getter,它应该是这样的:

QString getFavouriteHotel() const {
    return ui.<favourite-hotel-label>.text()
}

MainWindowwinApp.exec(); 之后,我建议添加一个 if 来检查用户是接受还是拒绝对话 (docs)。如果用户接受了对话框,那么您可以使用刚刚添加的 getter 检索文本。

提示:避免使用exec,如docs中所说,使用open

-- 更新 -- QDialog 接受 --

始终检查 docs

connect(&WinApp, &QDialog::finished, this, [this](int result) {
    if(result == QDialog::Accepted){
       // do aswomness
       return
   }
});