在我的项目中,我将Qt Designer表单类提升为mainwindow.ui
。促进ui我命名为doublerect.ui
,其中包含两个QspinBoxes
,一个是sb_rect_height
,另一个是sb_rect_width
。现在我需要将这些spinboex值传递给mainwindow.there,因为我创建了getters
和setters
。但是当我从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();
}
方法setHeight
类的setWidth
和DoubleRect
应该在 - 私人插槽中。
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()
- setHeight
和setWidth
,然后你想用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
。