我是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);
放在构造函数中时,没有问题。
有人请指出我的错误吗?
答案 0 :(得分:3)
从代码中可以推断出类DashBoard
继承了QObject
。 parent
的{{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
课程中提供一个方法来完成你想要的操作。