如何将提升的窗体的 QSpinBoxes 值传递给 MainWindow

How to pass promoted form's QSpinBoxes values to MainWindow

在我的项目中,我将 Qt Designer 表单 class 提升为 mainwindow.ui。提升 ui 我命名为 doublerect.ui 并且包含两个 QspinBoxes 一个是 sb_rect_height 另一个是 sb_rect_width 。现在我需要将这些 spinboex 值传递给 mainwindow.there,因为我创建了 getterssetters。但是当我从 mainwindow 访问 getter 时,这些值打印为 0 This main weight , 1072693248 This main height 。所以请告诉我并给我一个解决方案,我怎样才能从 mainwindow.This my complete code

访问这些旋转框值

doublerect.cpp

#include "doublerect.h"
#include "ui_doublerect.h"
#include "mainwindow.h"
#include "qdebug.h"

DoubleRect::DoubleRect(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::DoubleRect)
{
    ui->setupUi(this);
    connect(ui->sb_rect_height, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
            this, &DoubleRect::setHeight);
    connect(ui->sb_rect_width, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
            this, &DoubleRect::setWidth);
}

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

int DoubleRect::getWidth() const
{
    return width;
}

void DoubleRect::setWidth(int value)
{
    width = value;
}

int DoubleRect::getHeight() const
{
    return height;
}

void DoubleRect::setHeight(int value)
{
    height = value;
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qdebug.h>
#include <QColorDialog>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);
    ui->widgethide->setVisible(true);
}

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

void MainWindow::addRect()
{

    DoubleRect *obj = new DoubleRect();
    int height = obj->getHeight();
    int width = obj->getWidth();
    qDebug()<< height <<"This main height";
    qDebug()<< width <<"This main width";

}

void MainWindow::on_btnRect_clicked()
{
    addRect();
}

DoubleRect class 的方法 setHeightsetWidth 应该在部分 - 专用插槽中。

public:
  explicit DoubleRect(QWidget *parent = 0);
  ~DoubleRect();

  int getWidth() const;
  int getHeight() const;
public slots:

private slots:
  void setHeight(int value);
  void setWidth(int value);

编辑

当调用 addRect 方法时,在 DoubleRect 的构造函数中分配信号 valueChanged() 带有插槽的 SpinBox - setHeightsetWidth,然后您想使用 qDebug() 打印宽度和高度, 但首先您需要更改旋转框的值,以便可以调用插槽 - 并且可以设置宽度和高度。

您不能在每次调用 addRect() 方法时都创建 obj。该对象应该只创建一次。 然后建立信号槽连接,当旋转框的值改变时,你的槽将被调用正确设置高度和宽度。

编辑 2 您可以将 DoubleRect 对象定义为 MainWindow:

的成员
class MainWindow : public QMainWindow
{
  Q_OBJECT
private:
  Ui::MainWindow *ui;
  QGraphicsScene * scene;
  QGraphicsView * view;
  DoubleRect* obj;
};

在 MainWindow 的构造函数中创建此对象

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  //...
  obj = new DoubleRect();
}

现在,当您更改 SpinBox 的值时,插槽 setWidth/setHeight 将被调用,并且调用 'addRect' 方法您应该会得到正确的值。

编辑 3

我已经下载了你的项目,我使用的是QT 4.8.4,经过一些修改后它可以工作,所以

[1] doublerect.cpp

的变化
 DoubleRect::DoubleRect(QWidget *parent) :
 QWidget(parent),
 ui(new Ui::DoubleRect)
 {
    ui->setupUi(this);
    // NEW LINES !!! 
    connect (ui->sb_rect_height, SIGNAL(valueChanged(int)), this, SLOT(setHeight(int)));
    connect (ui->sb_rect_width, SIGNAL(valueChanged(int)), this, SLOT(setWidth(int)));
 }

使用连接函数在 SIGNAL - SLOT 之间建立连接

[2] 变化 doublerect.h

class DoubleRect : public QWidget
{
   Q_OBJECT
public:
  explicit DoubleRect(QWidget *parent = 0);
  ~DoubleRect();

  int getWidth() const;
  int getHeight() const;
 public slots:
 private slots:      // NEW LINES, these methods must be slots
   void setHeight(int value);
   void setWidth(int value);
 private:
    Ui::DoubleRect *ui;
    int width;
    int height;
 };

最重要的是,mainwindow.cpp

的变化
void MainWindow::addRect()
{
  //DoubleRect *obj = new DoubleRect();  // don't create new object
  int height = ui->widgethide->getHeight();
  int width = ui->widgethide->getWidth();
  qDebug()<< height <<"This main height";
  qDebug()<< width <<"This main width";
}

你不需要创建DoubleRect对象,这个对象已经存在,指向这个对象实例的指针是ui->widgethide