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指针的主要内容,如果未能解决你的问题,请参考以下文章