C++ Qt:不完整类型和转发声明的使用无效

C++ Qt:不完整类型和转发声明的使用无效,c++,qt,C++,Qt,我有一些误解: A.h A.cpp B.h #包括 #ifndef B_H #定义B_H 名称空间用户界面{ 乙级;; } B类 { Q_对象 公众: 显式B(QWidget*parent=0); 公众: Ui::B*Ui; }; #恩迪夫 由于编译的结果,我有以下错误: A.cpp:在构造函数“A::A()”中:对不完整类型“class Ui::B”的使用无效 B.h:“类Ui::B”的转发声明 有人能解释我为什么会有这样的错误吗?正如错误所说,没有可用的Ui::B定义,只有B.h中的声明;

我有一些误解:

A.h

A.cpp

B.h

#包括
#ifndef B_H
#定义B_H
名称空间用户界面{
乙级;;
}
B类
{
Q_对象
公众:
显式B(QWidget*parent=0);
公众:
Ui::B*Ui;
};
#恩迪夫
由于编译的结果,我有以下错误: A.cpp:在构造函数“A::A()”中:对不完整类型“class Ui::B”的使用无效 B.h:“类Ui::B”的转发声明


有人能解释我为什么会有这样的错误吗?

正如错误所说,没有可用的
Ui::B
定义,只有
B.h
中的声明;而且除非定义了类,否则不能编写访问类成员的代码


您需要包括定义了
Ui::B
的标题;或者,给
B
一个成员函数来做
a
需要做的任何事情,而不是直接与
B
的成员鬼混。

检查您的ui\u B.h。在它的末尾,您应该看到

namespace Ui {
    class B: public Ui_B {};
}
如果不是,您可以在Qt Designer中打开您的.ui文件,选择您的小部件,然后在Object Inspector中,将“Object”下的字符串更改为“B”。如果小部件是对话框,则默认值为“Dialog”


不要直接修改ui_B.h,因为它是由Qt编译器生成的,每次编译时都会被覆盖。

在Qt Creator中,打开对话框表单。选择对话框面板,并在右侧确保对象名称为B


这将让Qt构建系统知道您的对象是UI对象。如果没有这个,你的程序只知道你的面板是一个对象名称对话框。

事实上,我在整个应用程序建立后将“MainWindow”的名称更改为“LoginWindow”时遇到了这个问题。这对每个人来说都不是很有用,但将其名称更改为原始名称(在启动项目时您填写的名称)可以对我起作用。
仍然不知道Qt的.ui文件,希望任何人都能解释这一点~

提示:B和ui::B不是同一个类。它们完全不同。这里有两个不同的类,分别称为B、Ui::B和B。你确定这就是你想要的吗?正如Mike Seymour所注意到的,你应该在.cpp文件中包含相同的头,该头包含在B.cpp文件中,该文件包含
Ui::B
class的定义。是的。。我遇到了这种错误,最后是因为之前我重命名了类名,但fogot更新了这个ui的.ui对象名,因此名称没有正确自动生成。这看起来更像是Qt的疏忽。当为表单创建新类和新ui文件时,它建议将form.ui作为文件名,但如果我指定其他文件名,对象的名称仍然是“form”,在确保您所说的内容后,必须重新启动Qt creator,但不确定原因。竖起大拇指!此外,您还可以通过另一个编辑器(不是QtCreator)在*.ui文件中更改类字段和主小部件名称。这会解决你的问题。
#include "A.h"
A::A()
{
    B::ui->blancH2->setValue(2);
}
#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 
namespace Ui {
    class B: public Ui_B {};
}