C++ 从函数访问父小部件

c++ accessing parent widgets from a function

本文关键字:小部 访问 函数 C++      更新时间:2023-10-16

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

这是我的主窗口.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);放在构造函数中时,没有问题。

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

从代码中可以推断出类DashBoard继承QObjectQObjectparent字段被定义为指向QObject的指针,因此当您在类DashBoard的方法中调用parent->ui->menuSL->setCurrentIndex(0);时,您假设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的构造函数。

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

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

在选择方法中,尝试使用名为 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中提供一个方法来执行你想要的操作。