从QMainWindow中访问QDockWidget的小部件

时间:2014-07-16 21:16:17

标签: c++ qt

在我的QMainWindow范围内,我有一个继承QDockWindow的类AgilentSweeper的实例,并初始化并显示它:

sweeper = new AgilentSweeper(this);
addDockWidget(Qt::RightDockWidgetArea,sweeper);

这个类有一个Qt Creator制作的.ui形式,里面有几个小部件,构造函数如下:

AgilentSweeper::AgilentSweeper(QWidget *parent) :
    QDockWidget(parent),
    ui(new Ui::AgilentSweeper)
{
    ui->setupUi(this);

}

其中Ui::AgilentSweeper *ui是公开的。

从AgilentSweeper范围内的其他功能,我可以访问AgilentSweeper小部件并正常执行double power = ui->powerSpinBox->value();之类的操作。但是,我无法弄清楚如何从主Ui的范围内访问AgilentSweeper小部件。看起来这应该是可能的,因为清扫工是一个成员,我认为我应该能够做double power = sweeper->ui->powerSpinBox->value();之类的事情,但是尽管我已经搞了一段时间,但我无法弄清楚如何从中获取任何东西扫地车的ui。我可以想到几种解决方法,但这看起来应该是可能的。

1 个答案:

答案 0 :(得分:1)

ui对象默认定义为AgilentSweeper的私有成员。通常情况下,您无法访问它。 一些解决方案:

  1. 非常糟糕:宣布QMainWindow为好友
  2. bad:更改为AgilentSweeper.h私有:公开:对于Ui :: AgilentSweeper
  3. 我更喜欢的一个:对于您想要公开的UI小部件的每个方法,在AgilentSweeper.h中创建一个公共方法
  4. 所以你可以通过

    访问spinbox-value
    //in AgilentSweeper.h
    double powerSpinBoxValue()
    {
        return ui->powerSpinBox->value()
    }
    
    //call from outside:
    double power = sweeper->powerSpinBoxValue();
    

    编辑 2解释

    对象Ui::AgilentSweeper *ui在AgilentSweeper.h中定义,使用前向声明。因此,在仅包含AgilentSweeper.h的文件中,没有给出任何信息,如何创建对象的实例以及它提供的方法。 此信息由自动生成的文件ui_AgilentSweeper.h提供。所以为了使用方式2,还包括ui_AgilentSweeper.h。

    为什么这个解决方案不好?它看起来很灵活吗?

    在第一行暴露成员公众是坏的。用户可以删除实例:例如delete sweeper->ui->powerSpinBox

    此外,无法记录或锁定对成员对象的访问权。