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

标签 c++ qt

我使用 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/

相关文章:

C++ 标准布局和引用

c++ - 在 C++11 标准中哪里说 char* p = "abc";是病态的?

c++ - 将多个 vector 转换为数组,或返回它们 (c++)

QT设计器: Connect QSlider and QDoubleSpinBox (both ways)

c++ - QWebSocketServer - 不释放内存

c++ - 来自 Qt 文件的编译时错误 : expected unqualified-id before ')' token

c++ - 在 Qt 的 connect() 中传递不同的类

c++ - 使 OpenGL 代码适应 Qt(特别是 keyPressEvent)

c++ - 是否有标准的 C++11 解决方案来转义单引号?

c++ - 两个具有相同代码的共享对象(.so)文件的一致性如何