如何将提升的窗体的 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,因为我创建了 getters
和 setters
。但是当我从 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 的方法 setHeight
和 setWidth
应该在部分 - 专用插槽中。
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 - setHeight
和 setWidth
,然后您想使用 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
。
在我的项目中,我将 Qt Designer 表单 class 提升为 mainwindow.ui
。提升 ui 我命名为 doublerect.ui
并且包含两个 QspinBoxes
一个是 sb_rect_height
另一个是 sb_rect_width
。现在我需要将这些 spinboex 值传递给 mainwindow.there,因为我创建了 getters
和 setters
。但是当我从 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 的方法 setHeight
和 setWidth
应该在部分 - 专用插槽中。
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 - setHeight
和 setWidth
,然后您想使用 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
。