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

问题描述 投票:0回答:1

在我的项目中,我将Qt Designer表单类提升为mainwindow.ui。促进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.This my complete code访问这些spinbox值

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();
}
c++ qt parameter-passing getter-setter
1个回答
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的构造函数中,你用你的插槽分配SpinBox的信号valueChanged() - 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

© www.soinside.com 2019 - 2024. All rights reserved.