c ++从函数访问父窗口小部件

时间:2013-09-06 04:06:01

标签: c++ qt

我是C ++和Qt的新手,我正在尝试从父类访问一个小部件。

这是我的mainwindow.cpp

MainWindow::MainWindow( QWidget *parent )
    : QMainWindow( parent )
    , ui( new Ui::MainWindow ) 
{
    ui->setupUi(this);
}

我有另一个类,我正在尝试从该类中的“ui”访问一个小部件。像这样:

DashBoard::DashBoard( MainWindow *parent ) : QObject( parent ) 
{
}

void DashBoard::select(  ) 
{
    parent->ui->menuSL->setCurrentIndex(0);
}

这给我一个错误,说明无法解析方法和字段。但是当我将行parent->ui->menuSL->setCurrentIndex(0);放在构造函数中时,没有问题。

有人请指出我的错误吗?

2 个答案:

答案 0 :(得分:3)

从代码中可以推断出类DashBoard继承了QObjectparent的{​​{1}}字段被定义为指向QObject的指针,因此当您在类QObject的方法中调用parent->ui->menuSL->setCurrentIndex(0);时,您假设DashBoard定义了一个名为QObject的成员,但这不是真的。

以这种方式施展父母:

ui

或者这个:

((MainWindow*)(parent()))->ui->menuSL->setCurrentIndex(0);

在构造函数中,您没有看到错误,因为MainWindow* parent = qobject_cast<MainWindow*>(this->parent()); // check parent is not null parent->ui->menuSL->setCurrentIndex(0); 被定义为指向类parent的对象的指针,然后传递给MainWindow的构造函数。 / p>

如果在QObject cpp文件中使用Qt Designer(在您的情况下可能为ui),请不要忘记将"ui_mainwindow.h"公开并包含自动生成的UI标头。

注意:我只是想回答你的问题,但我鼓励你回顾一下你这样做的方式。有多种方法可以通过更一致的OO设计实现相同的目标。

答案 1 :(得分:2)

在select方法中,您尝试使用名为parent的变量。但是你需要QObject::parent()方法。

此外,您需要将父级转换为QMainWindow

void DashBoard::select(  ) {
  QMainWindow* parent = qobject_cast<QMainWindow>(this->parent());
  if (parent == 0) { return; } // or some other error handling
  parent->ui->menuSL->setCurrentIndex(0);
}

如果是公开的,您只能访问ui

我认为你应该在MainWindow课程中提供一个方法来完成你想要的操作。