gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:15 24 4
gpt4 key购买 nike

我使用 QT Creator 创建了 MainWindow 类。然后我将一些 pushbutton 添加到 MainWindow 以打开一个新对话框,我使用 QT Form Designer 创建了表单类。

当用户单击该按钮时,将打开一个新对话框。新对话框有一个 QTableWidget 和一个 pushbutton。用户可以用一些值填充 QTableWidget 并在单击对话框的 pushbutton 之后我想将这些值发送到 MainWindow 以填充 QVector xQVector yMainWindow 类的属性。

我怎样才能做到这一点?如何从 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 获取数据。
添加到 Dialog.h:

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

signals:
dataReady();

private:
QVector<double> x;
QVector<double> y;

添加到 Dialog.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();

添加到MainWindow.h

private slots:
void onDataReady();

添加到 MainWindow.cpp

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

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

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

关于c++ - 如何通过Qdialog中的qtablewidget填充作为MainWindow成员的qvector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57762083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com