0

我创建了一个对话框,我在其中询问一些切片的长度,例如 xmax、ymax 和 zmax 作为切片数。我打算在 qvtkwidget 的主窗口中使用这些数字。我将简化并将示例仅用于一个变量,以便您理解并帮助我。

这是我的 dialog.cpp

#include <QtGui/QApplication>
#include <QDir>
#include <iostream>
using namespace std;

#include "dialog.h"
#include "ui_dialog.h"

// Create getters to transfer variables to main.cpp
double Dialog::getxpax()
{
    return xpax;
}

// Start the mainwindow
void Dialog::startplanevolume()
{
  // Getting some proprieties for the lenght of the volume
    QString XMAX=ui->lineEdit->text();
    xpax=XMAX.toDouble();

    if (xpax==0)
    {
        ui->label_17->setText("Error: Can't start, invalid \nmeasures");
        ui->label_17->setStyleSheet("QLabel { color : red; }");
    }
    else
    {
        this->accept();        
    }
}

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

  // Control volume measures
    // Making the lineedit objects only accept numbers
    ui->lineEdit->setValidator(new QDoubleValidator(this));

  // Start planevolume
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(startplanevolume()));
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(hide()));

}

pushbutton 是确定按钮,而 pushbutton_2 是取消按钮。

在我的主窗口中,我创建了一个 setter 函数来设置 xmax 的值。

这是一些代码。

// Get stored data from dialog
void planevolume::setxpax(double xpax)
{
    xp=xpax;
}

当我使用 qDebug() 时,settter 中的 xp 向我显示 xp 实际上获得了 xpax 值。

这是我的 main.cpp

#include <QtGui/QApplication>
#include <iostream>
using namespace std;

#include "planevolume.h"
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Dialog *dialog= new Dialog;

    if (dialog->exec())
    {
        planevolume mainwindow;
        mainwindow.setxpax(dialog->getxpax());
        mainwindow.show();
        return app.exec();
    }

return 0;
}

所以唯一的问题是在这里,当我需要它时,在 mainwindow as planevolume.cpp 中,该值尚未设置,

planevolume::planevolume(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::planevolume)

{
    ui->setupUi(this);

// My vtk statements are here in the code, but they are 
// executed before the setter gives the value to my new 
// variable xp, so when I need the value it has not been set yet.

有什么想法吗?

4

1 回答 1

0

如果planevolume构造函数需要这些数据,它们可以作为参数传递给构造函数本身(您也可以让对话框返回结构内的所有变量,以便传递一个参数,而不是每个参数都有一个访问器)。

另一种解决方案是在事件循环开始后调用 vtk 部分,方法是将其放入插槽中并使用QTimer::singleShot.

在最后一种情况下,您的代码应如下所示:

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

    QTimer::singleShot(0, this, SLOT(setupVtk()));
}

// declared as a slot in the class
void planevolume::setupVtk() 
{
    // Your VTK statements would be here
}
于 2012-09-04T12:25:36.937 回答