将变量从mainwindow传递到另一个Qt C ++形式

时间:2018-07-29 04:21:47

标签: c++ qt sqlite

我想将三个字符串(cellTitle,cellPoem,cellGroup)从主窗口传递到另一个对话框。我知道当我启动第二种形式时,值变为零。我在某处读到有插槽的可能,但我不知道如何。

mainwindows.h

public:
QString cellTitle,cellPoem,cellGroup;

mainwindows.cpp

void MainWindow::on_tableView_pressed(const QModelIndex &index)

{

    cellText = ui->tableView->model()->data(index).toString();



    QSqlQuery * qry2 = new QSqlQuery(mydb);

    qry2->prepare("select * from Poems where Title='"+cellText+"'");
    qry2->exec();


    while(qry2->next()){

    cellTitle = qry2->value(1).toString();
    cellPoem = qry2->value(2).toString();
    cellGroup = qry2->value(3).toString();



    ui->textEdit->setText(qry2->value(2).toString());

 }

}

void MainWindow::on_btnUpdate_clicked()

{

   frmUpdate frmupdate;
   frmupdate.setModal(true);
   frmupdate.exec();

}

frmupdate.cpp

#include "frmupdate.h"

#include "ui_frmupdate.h"
#include <mainwindow.h>

frmUpdate::frmUpdate(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::frmUpdate)
{
    ui->setupUi(this);

    MainWindow mainwindow;

    ui->lineEdit->setText(mainwindow.cellTitle);
    ui->lineEdit_2->setText(mainwindow.cellGroup);
    ui->textEdit->setText(mainwindow.cellPoem);
}

frmUpdate::~frmUpdate()
{
    delete ui;
}

void frmUpdate::on_btnUpdate_clicked()
{


}

void frmUpdate::on_pushButton_2_clicked()
{
    this->close();
}

1 个答案:

答案 0 :(得分:0)

frmUpdate::frmUpdate(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::frmUpdate)
{
    ui->setupUi(this);

    MainWindow mainwindow;

您在这里仅使用默认构造函数创建了一个新的临时 MainWindow实例。当然,然后使用空的默认文本创建此新实例:

    ui->lineEdit->setText(mainwindow.cellTitle);
    ui->lineEdit_2->setText(mainwindow.cellGroup);
    ui->textEdit->setText(mainwindow.cellPoem);
}

现在最简单的方法是将原始主窗口作为参数传递:

frmUpdate::frmUpdate(QWidget* parent, MainWindow* mainWindow) :
    QDialog(parent),
    ui(new Ui::frmUpdate)
{
    ui->setupUi(this);
    ui->lineEdit->setText(mainwindow->cellTitle);
    ui->lineEdit_2->setText(mainwindow->cellGroup);
    ui->textEdit->setText(mainwindow->cellPoem);
}

如果主窗口,则可以简单地进行以下投射:

frmUpdate::frmUpdate(QWidget* parent) :
    QDialog(parent),
    ui(new Ui::frmUpdate)
{
    ui->setupUi(this);
    MainWindow* mainWindow = qobject_cast<MainWindow*>(parent);
    if(mainWindow)
    {
        ui->lineEdit->setText(mainwindow->cellTitle);
        ui->lineEdit_2->setText(mainwindow->cellGroup);
        ui->textEdit->setText(mainwindow->cellPoem);
    }
    else
    {
        // appropriate error handling
    }
}

您也可以从父级搜索主窗口:

for(;;)
{
    MainWindow* mainWindow = qobject_cast<MainWindow*>(parent);
    if(mainWindow)
    {
        ui->lineEdit->setText(mainwindow->cellTitle);
        ui->lineEdit_2->setText(mainwindow->cellGroup);
        ui->textEdit->setText(mainwindow->cellPoem);
        break;
    }
    parent = parent->parent();
    if(!parent)
    {
        // appropriate error handling
        break;
    }
}

以上假设MainWindow继承自QObject ...