Qt无法从继承类访问*ui指针

Posted

技术标签:

【中文标题】Qt无法从继承类访问*ui指针【英文标题】:Qt Cannot access *ui pointer from inheriting class 【发布时间】:2015-06-20 11:20:08 【问题描述】:

我正在尝试编写一个应用程序,其中我将拥有一个通用对话框窗口和特定的对话框窗口,这些窗口将从通用窗口继承一些基本功能。我不确定这是不是最好的方法,但我就是这样做的(CGenericProject 类是从 Qt Creator 中的 Dialog 模板创建的):

CGenericProject.h:

#include <QDialog>

namespace Ui 
class CGenericProject;


class CGenericProject : public QDialog

    Q_OBJECT

public:
    explicit CGenericProject(QWidget *parent = 0);
    ~CGenericProject();

protected:
    Ui::CGenericProject *ui;
;

CGenericProject.cpp:

#include "cgenericproject.h"
#include "ui_cgenericproject.h"

CGenericProject::CGenericProject(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CGenericProject)

    ui->setupUi(this);


CGenericProject::~CGenericProject()

    delete ui;

CEisProject.h:

#include "cgenericproject.h"

class CEisProject : public CGenericProject

public:
    CEisProject();
    ~CEisProject();

;

CEisProject.cpp:

#include "ceisproject.h"

CEisProject::CEisProject()

    ui-> NO ACCESS


CEisProject::~CEisProject()



正如您在CEisProject.cpp 文件中看到的,我无法访问从CGenericProject 继承的ui 字段,即使它是protected。我的意思是,我看到ui 本身,但我没有看到它的方法和成员。我将在那里定义的任何其他变量都可以访问。怎么了?我将不胜感激以这种方式提供的所有帮助。

【问题讨论】:

您是否尝试过编译代码而不尝试访问 ui?它会给你任何错误吗? 代码编译得很好,我也再次运行了qmake。 由于您在 Ui::CGenericProject 的构造函数中创建了一个新的 Ui::CGenericProject,我希望您的程序“永远”继续创建新实例。 但是我只运行了一次构造函数。 【参考方案1】:

你必须添加行

#include "ui_cgenericproject.h"

CEisProject.cpp 文件。

CGenericProject.h 文件包含在CEisProject.h 中,但CEisProject.h 无权访问CGenericProject.cpp。在基类的标题中,您只有一个 Ui::CGenericProject 的前向声明,并且您将其文件包含在 .cpp 中。所以CGenericProject.cpp知道这个类的实现。

CEisProject.cpp 无权访问该文件,因此您必须在此处再次包含该文件。

注意 您的前向声明令人困惑,您应该正确缩进。此外,在您的代码中添加一些 cmets 以更清楚地了解谁在阅读它,您正在使用两个具有相同名称的不同类。

【讨论】:

确实是这样。但是在这种情况下,将#include "ui_cgenericproject.h" 移动到CGenericProject.h 不是更好吗? 是的,但这取决于您在ui_cgenericproject.h 中所做的事情。你应该做你现在正在做的事情以避免循环依赖,但是如果你从不在ui_cgenericproject.h(或其中包含的任何头文件)中使用这些类,你可以这样做。

以上是关于Qt无法从继承类访问*ui指针的主要内容,如果未能解决你的问题,请参考以下文章

无法从基类指针访问子类方法

Qt:子窗口中如何获取主窗体ui中的控件

Qt访问继承类的D-Pointer

qt如何获取主窗口的指针

无法将参数 1 从派生指针转换为基类指针引用

QT基础