如何通过 Qdialog 中的 qtablewidget 填充作为 MainWindow 成员的 qvector



我使用 QT Creator 创建了MainWindow类。然后,我添加了一些pushbuttonMainWindow以打开一个新对话框,我使用 QT 表单设计器创建了该对话框。

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

我怎样才能做到这一点? 如何从QDialog获取MainWindow实例?我会在函数中写什么:

void Dialog::on_pushButton_clicked() {
// Code Here
}

提前感谢您的帮助,

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

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "dialog.h"
#include <QVector>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow() override;
private:
Ui::MainWindow *ui;
Dialog *geometria;
QVector<double> x;
QVector<double> y;
private slots:
void generate();
};
#endif // MAINWINDOW_H 
////////////////////////////////////////
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
geometria=new Dialog(this);
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(generuj_przekroj()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::generate()
{
geometria->show();
}
////////////////////////////////////
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
public slots:
void wcisnij();
void  wstaw_wiersz();
bool  eventFilter(QObject *target, QEvent *event);
private slots:
void on_pushButton_clicked();
private:
Ui::Dialog *ui;

};
#endif // DIALOG_H
/////////////////////////////////////////
#include "dialog.h"
#include "ui_dialog.h"
#include <QKeyEvent>
#include "xy.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->tableWidget->setRowCount(10);
ui->tableWidget->setColumnCount(2);
ui->tableWidget->setCurrentCell(4,1);
ui->tableWidget->installEventFilter(this);
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(wcisnij()));
connect(ui->tableWidget,SIGNAL(itemSelectionChanged()),this,SLOT(wcisnij()));
connect(ui->tableWidget,SIGNAL(itemSelectionChanged()),this,SLOT(wstaw_wiersz()));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::wcisnij()
{
int r=ui->tableWidget->currentRow();
int c=ui->tableWidget->currentColumn();
}
void  Dialog::wstaw_wiersz()
{
int n=0;
n=ui->tableWidget->rowCount();
if(ui->tableWidget->currentRow()==n-1)
ui->tableWidget->setRowCount(n+1);
}
bool  Dialog::eventFilter(QObject *target, QEvent *event) {
if (target==ui->tableWidget && event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if( keyEvent->key() == Qt::Key_Return|| keyEvent->key() == Qt::Key_Down )
{
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_Up )
{
int n=0;
int k=0;
n=ui->tableWidget->currentRow();
k=ui->tableWidget->currentColumn();
ui->tableWidget->setCurrentCell(n-1,k);
}
return true;
}
else
return QObject::eventFilter(target, event);
}

void Dialog::on_pushButton_clicked()
{
}

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

public:
std::vector<float> getX() { return x; }
std::vector<float> getY() { return y; }
signals:
dataReady();
private:
QVector<double> x;
QVector<double> y;

添加到对话框.cpp:

void Dialog::on_pushButton_clicked()
for (int r=0; r<rows; ++r)
for (int c=0; c<rows; ++c) {
QTableWidgetItem cell = tableWidget->item(r, c);
QString contents = cell.text();
double val = contents.toDouble();
x.push_back(val);
}
//  And do the same to collect y data
emit dataReady();

添加到主窗口。

private slots:
void onDataReady();

添加到主窗口.cpp

MainWindow::MainWindow(...etc
{ ...
geometria=new Dialog(this);
connect(*geometria, SIGNAL(dataReady()), this, SLOT(onDataReady()));
...
}
MainWindow::onDataReady()
{
x = geometria->getX();
y = geometria->getY();
}

最新更新