如何将提升的表单的QSpinBoxes值传递给MainWindow

时间:2017-12-16 16:56:09

标签: c++ qt parameter-passing getter-setter

在我的项目中,我将 Qt Designer表单类提升为mainwindow.ui。我将其命名为doublerect.ui,其中包含两个QspinBoxes一个sb_rect_height,另一个为sb_rect_width。现在我需要将这些spinboex值传递给mainwindow.there,因为我创建了getterssetters。但是当我从getter访问mainwindow时,这些值会打印为 0 This main weight , 1072693248 This main height 。所以请告诉我并给我一个解决方案如何从mainwindow访问这些spinbox值。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();
}

1 个答案:

答案 0 :(得分:0)

setHeight类的setWidthDoubleRect方法应位于 - 私有广告位中。

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()打印宽度和高度, 但首先你需要改变spinbox的值才能调用槽 - 并且可以设置带高度的宽度。

每次调用obj方法时,都无法创建addRect()。该对象应该只创建一次。 然后进行信号槽连接,当旋转盒的值改变时,你的插槽将被称为正确设置高度和宽度。

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

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

在MainWindow的ctor中创建此对象

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)));
 }

使用connect函数在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