C++ 如何通过Qdialog中的qtablewidget填充作为主窗口成员的qvector

C++ 如何通过Qdialog中的qtablewidget填充作为主窗口成员的qvector,c++,qt,C++,Qt,我使用QT Creator创建了MainWindow类。然后我在main窗口中添加了一些按钮,以打开一个新对话框,我使用QT表单设计器创建了表单类 当用户单击按钮时,将打开一个新对话框。新对话框有一个QTableWidget和一个按钮。用户可以用一些值填充QTableWidget,单击对话框的按钮后,我想将这些值发送到MainWindow,以填充QVector x和QVector y,它们是MainWindow类的属性 我怎样才能做到这一点? 如何从QDialog获取main窗口的实例?我应该在

我使用QT Creator创建了
MainWindow
类。然后我在
main窗口中添加了一些
按钮
,以打开一个新对话框,我使用QT表单设计器创建了表单类

当用户单击按钮时,将打开一个新对话框。新对话框有一个
QTableWidget
和一个
按钮
。用户可以用一些值填充
QTableWidget
,单击对话框的
按钮后,我想将这些值发送到
MainWindow
,以填充
QVector x
QVector y
,它们是
MainWindow
类的属性

我怎样才能做到这一点? 如何从
QDialog
获取
main窗口的实例?我应该在函数中写什么:

void Dialog::on_pushButton_clicked() {
    // Code Here
}
提前感谢您的帮助

彼得 下面是我的两个类的代码

\ifndef主窗口
#定义主窗口
#包括
#包括“dialog.h”
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=nullptr);
~MainWindow()覆盖;
私人:
Ui::MainWindow*Ui;
对话框*几何图形;
qx向量;
qy向量;
专用插槽:
void生成();
};
#endif//main窗口
////////////////////////////////////////
#包括“mainwindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
geometria=新建对话框(此对话框);
连接(用户界面->按钮,信号(点击()),此,插槽(generuj_przekroj());
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void MainWindow::generate()
{
几何->显示();
}
////////////////////////////////////
#ifndef对话框
#定义对话框
#包括
名称空间用户界面{
类对话框;
}
类对话框:公共QDialog
{
Q_对象
公众:
显式对话框(QWidget*parent=nullptr);
~Dialog();
公众时段:
void wcisnij();
void wstaw_wiersz();
bool事件过滤器(QObject*目标,QEvent*事件);
专用插槽:
单击按钮时无效();
私人:
Ui::Dialog*Ui;
};
#endif//对话框
/////////////////////////////////////////
#包括“dialog.h”
#包括“ui_dialog.h”
#包括
#包括“xy.h”
Dialog::Dialog(QWidget*父项):
QDialog(父级),
ui(新建ui::对话框)
{
用户界面->设置用户界面(此);
ui->tableWidget->setRowCount(10);
ui->tableWidget->setColumnCount(2);
ui->tableWidget->setCurrentCell(4,1);
ui->tableWidget->installEventFilter(此);
连接(ui->按钮,信号(点击()),此,插槽(wcisnij());
连接(ui->tableWidget,信号(itemSelectionChanged()),此,插槽(wcisnij());
连接(ui->tableWidget,信号(itemSelectionChanged()),此,插槽(wstaw_wiersz());
}
对话::~Dialog()
{
删除用户界面;
}
void Dialog::wcisnij()
{
int r=ui->tableWidget->currentRow();
int c=ui->tableWidget->currentColumn();
}
void Dialog::wstaw_wiersz()
{
int n=0;
n=ui->tableWidget->rowCount();
如果(ui->tableWidget->currentRow()==n-1)
ui->tableWidget->setRowCount(n+1);
}
bool对话框::事件过滤器(QObject*target,QEvent*event){
if(target==ui->tableWidget&&event->type()==QEvent::KeyPress){
QKeyEvent*keyEvent=静态广播(事件);
如果(keyEvent->key()==Qt::key_返回| | keyEvent->key()==Qt::key_向下)
{
int n=0;
int k=0;
n=ui->tableWidget->currentRow();
k=ui->tableWidget->currentColumn();
ui->tableWidget->setCurrentCell(n+1,k);
}
if(keyEvent->key()==Qt::key\u Up)
{
int n=0;
int k=0;
n=ui->tableWidget->currentRow();
k=ui->tableWidget->currentColumn();
ui->tableWidget->setCurrentCell(n-1,k);
}
返回true;
}
其他的
返回QObject::eventFilter(目标,事件);
}
无效对话框::在按钮上单击()
{
}

简单的回答是在对话框中加载数据,然后向MainWindow发出一个信号,表明它已准备就绪,并让MainWindow获取数据。
添加到Dialog.h:

public:
    std::vector<float> getX() { return x; }
    std::vector<float> getY() { return y; }

signals:
    dataReady();

private:
    QVector<double> x;
    QVector<double> y;
添加到MainWindow.cpp

    MainWindow::MainWindow(...etc
{ ...
    geometria=new Dialog(this);

    connect(*geometria, SIGNAL(dataReady()), this, SLOT(onDataReady()));
    ...
}

        MainWindow::onDataReady()
{
    x = geometria->getX();
    y = geometria->getY();
}

简单的回答是在对话框中加载数据,然后向MainWindow发出一个信号,表明它已准备就绪,并让MainWindow获取数据。
添加到Dialog.h:

public:
    std::vector<float> getX() { return x; }
    std::vector<float> getY() { return y; }

signals:
    dataReady();

private:
    QVector<double> x;
    QVector<double> y;
添加到MainWindow.cpp

    MainWindow::MainWindow(...etc
{ ...
    geometria=new Dialog(this);

    connect(*geometria, SIGNAL(dataReady()), this, SLOT(onDataReady()));
    ...
}

        MainWindow::onDataReady()
{
    x = geometria->getX();
    y = geometria->getY();
}

谢谢你,马塞尔。现在看起来好多了。你有什么想法吗?对不起。我的眼睛有雾。凌晨1点。我假设你正在使用QTableWidget。你知道如何从中获取数据吗?是的,我知道,但不知道如何将其传递到主窗口。请睡觉。我们将在第二天返回:)谢谢你,马塞尔。现在看起来好多了。你有什么想法吗?对不起。我的眼睛有雾。凌晨1点。我假设你正在使用QTableWidget。你知道如何从中获取数据吗?是的,我知道,但不知道如何将其传递到主窗口。请睡觉。我们将在第二天返回此页面:)哇,谢谢你的回复。下班后我将检查它是否正确works@Piotr酷!如果你对某个答案感到满意,那么点击答案左侧的小复选标记,将问题标记为已回答。这会让人们知道你有你的答案,并通过提高他们的声誉帮助回答你的人。哇,谢谢你的回复。下班后我会检查一下是否有works@Piotr酷!如果你对某个答案感到满意,那么点击答案左侧的小复选标记,将问题标记为已回答。这让人们知道你有你的答案,并通过提高他们的声誉来帮助回答你的人。