首页 > 解决方案 > 将变量从主窗口传递到另一个 qt c++ 表单

问题描述

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

主窗口.h

public:
QString cellTitle,cellPoem,cellGroup;

主窗口.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();
}

标签: c++qtsqlite

解决方案


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...


推荐阅读