将变量值从 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()
}
在 MainWindow
行 winApp.exec();
之后,我建议添加一个 if 来检查用户是接受还是拒绝对话 (docs)。如果用户接受了对话框,那么您可以使用刚刚添加的 getter 检索文本。
提示:避免使用exec
,如docs中所说,使用open
-- 更新 -- QDialog 接受 --
始终检查 docs
connect(&WinApp, &QDialog::finished, this, [this](int result) {
if(result == QDialog::Accepted){
// do aswomness
return
}
});
我的 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()
}
在 MainWindow
行 winApp.exec();
之后,我建议添加一个 if 来检查用户是接受还是拒绝对话 (docs)。如果用户接受了对话框,那么您可以使用刚刚添加的 getter 检索文本。
提示:避免使用exec
,如docs中所说,使用open
-- 更新 -- QDialog 接受 --
始终检查 docs
connect(&WinApp, &QDialog::finished, this, [this](int result) {
if(result == QDialog::Accepted){
// do aswomness
return
}
});