代码之家  ›  专栏  ›  技术社区  ›  Gamma

如何将提升窗体的QSPINBOKS值传递到主窗口

  •  0
  • Gamma  · 技术社区  · 7 年前

    在我的项目中,我提升了 Qt设计器窗体类 mainwindow.ui . 升级的ui I命名为 doublerect.ui 其中包含两个 QspinBoxes 一个是 sb_rect_height 另一个是 sb_rect_width . 现在,我需要将这些spinboex值传递到主窗口。我为其创建了 getters setters . 但当我访问 getter 从…起 mainwindow 这些值打印如下 0 This main weight , 1072693248 This main height . 请告诉我,并给我一个解决方案,我如何从 主窗口 . 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;
    }
    

    主窗口。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 回复  |  直到 7 年前
        1
  •  0
  •   rafix07    7 年前

    方法 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 方法的构造函数中调用 双矩形 您分配信号 valueChanged() 带插槽的SpinBox- 设置高度 设置宽度 ,然后要使用打印宽度和高度 qDebug() , 但首先需要更改spinbox的值,以便可以调用插槽,并且可以设置宽度和高度。

    您无法创建 obj 每次你打电话 addRect() 方法此对象只能创建一次。 然后进行信号插槽连接,当spinbox的值更改时,将调用插槽正确设置高度和宽度。

    编辑2 您可以定义 双矩形 对象作为的成员 MainWindow :

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

    在主窗口的ctor中创建此对象

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

    现在,当您更改SpinBox的值时,将调用slots 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)));
     }
    

    使用连接功能连接信号-插槽

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

    最重要的是 主窗口。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";
    }
    

    您不需要创建 双矩形 对象,此对象已存在,指向此对象实例的指针为 ui->widgethide .