8

我是 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);放在构造函数中时,就没有问题了。

有人可以指出我的错误吗?

4

2 回答 2

3

从代码中可以推断出该类DashBoard继承了QObject. a的parent字段QObject被定义为指向 a 的指针,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然后传递给QObject的构造函数。

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

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

于 2013-09-06T04:31:16.150 回答
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的类中提供一个方法来执行你想要的操作。

于 2013-09-06T04:21:26.217 回答