Qt:无效使用不完整类型和前向声明
Qt: invalid use of incomplete type and forward declaration
我有一些误解:
啊
#ifndef A_H
#define A_H
#include "B.h"
class A : public B
{
Q_OBJECT
public:
A();
};
#endif
答.cpp
#include "A.h"
A::A()
{
B::ui->blancH2->setValue(2);
}
B.h
#include <QWidget>
#ifndef B_H
#define B_H
namespace Ui {
class B;
}
class B
{
Q_OBJECT
public:
explicit B(QWidget *parent = 0);
public:
Ui::B *ui;
};
#endif
编译的结果是我有下一个错误:A.cpp:在构造函数"A::A()"中:无效使用不完整的类型"类 Ui::B"B.h:前向声明"Ui::B类"
谁能解释为什么我有这个错误?
检查你ui_B.h.在它的最后,你应该看到
namespace Ui {
class B: public Ui_B {};
}
如果不是,您可以在Qt Designer中打开.ui文件,选择您的小部件,然后在对象检查器中,将"对象"下的字符串更改为"B"。如果您的小部件是对话框,则默认值为"对话框"。
不要直接修改ui_B.h,因为它是由Qt编译器生成的,每次编译时都会被覆盖。
正如错误所说,没有可用的Ui::B
定义,只有B.h
中的声明; 除非定义了类,否则您无法编写访问类成员的代码。
你需要包括定义Ui::B
的任何标头;或者,也许,给B
一个成员函数来做任何A
需要做的事情,而不是直接与B
的成员打交道。
在Qt Creator中,打开对话框表单。 选择对话框面板,并在右侧确保"对象名称"为 B。
这将使Qt构建系统知道您的对象是UI对象。 如果没有这个,你的程序只知道你的面板是对象名称 Dialog。
实际上,在整个应用程序建立后,当我将"MainWindow"的名称更改为"登录窗口"时,我遇到了这个问题。这对每个人都没有用,但将其名称更改为原始名称(您在启动项目时填写)可以为我工作。还是不知道Qt的.ui文件希望有人能解释一下~
相关文章:
- std::enable_if 更改成员 *变量* 声明/类型
- 对前向声明类型进行unique_ptr的解决方法
- 如何将声明类型作为参数发送
- 在 Fortran 中泛化特定声明类型的操作
- 使用 (c++11) 声明类型时放置 __declspec(dllimport) 关键字的位置
- 模板函数可以使用带有删除的构造函数的声明类型
- 声明类型没有任何可变类型
- 如何使用声明类型简化此代码
- 使用声明类型选择函数专业化
- 替代班级内声明类型的别名
- 对于自动键入推论的参数,声明类型(自动)应推导的内容
- 使用 decltype 的条件声明类型
- 您如何声明类型结构的堆栈?在C 中
- 将指向前向声明类型的指针推送到 typedef'd 向量时出现编译器错误
- 声明适用于 auto,但不能显式声明类型?
- 声明类型包含未展开的参数包'Args'
- 课堂上的Typedef.在另一个类错误中:尚未声明类型
- 冲突的声明类型/价值不匹配
- 获取具有AST访问者clang的功能声明类型
- 变量声明类型定义 C 中的约定