Qt:不完整类型的无效使用和前向声明

6

I have some misunderstanding:

A.h

#ifndef A_H
#define A_H

#include "B.h"

class A : public B
{
    Q_OBJECT
public:
    A();
};
#endif

A.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()’中:无效使用不完整类型‘class Ui::B’ B.h: ‘class Ui::B’的前向声明

有谁能解释一下为什么会出现这些错误?

1
提示:B和Ui::B不是同一个类。它们完全不同。 - Nikos C.
1
你这里有两个不同的类叫做B,一个是Ui::B,另一个只是B。你确定这是你想要的吗? - pentadecagon
正如Mike Seymour所指出的那样,您应该在a.cpp文件中包含与b.cpp中包含的Ui::B类定义相同的头文件。 - Pie_Jesu
4个回答

15

请检查您的 ui_B.h 文件。在文件末尾,您应该看到:

namespace Ui {
    class B: public Ui_B {};
}

如果不是这样的话,你可以在Qt Designer中打开你的.ui文件,选择你的小部件,在对象检查器中更改“对象”下的字符串为“B”。如果你的小部件是对话框,默认值是“Dialog”。

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


1
是的.. 我遇到了这种错误,最终发现是因为我之前重命名了类名但忘记在.ui文件中更新该UI的对象名称,因此名称没有被正确地自动生成。 - vivi
这更像是Qt的疏忽。当创建一个新类和一个新的ui文件用于表单时,它会建议将文件名命名为form.ui,但如果我指定不同的文件名,对象的名称仍将是“Form”。 - vsz
确保你所说的后,我不得不重新启动Qt Creator,虽然不知道为什么。非常感谢! - 3bdalla

11

正如错误提示中所述,Ui::B 没有定义,只有在B.h中声明了;除非已经定义了类,否则不能编写访问类成员的代码。

您需要包含定义Ui::B的头文件;或者,也许可以给B添加一个成员函数来执行A需要做的操作,而不是直接使用B的成员。


5
在Qt Creator中,打开对话框形式。选择对话框面板并在右侧确保对象名称为B。这将让Qt构建系统知道您的对象是UI对象。如果没有这个,您的程序只知道您的面板作为对象名称对话框。

1
实际上,当我将“MainWindow”更改为“LoginWindow”后,整个应用程序都已经建立,我遇到了这个问题。这可能对每个人都无用,但将其名称更改为原始名称(您在启动项目时填写的名称)对我有效。仍然不了解Qt的.ui文件,希望有人能解释一下~

1
此外,您可以通过另一个编辑器(而非QtCreator)在*.ui文件中更改类字段和主窗口小部件名称。这将解决您的问题。 - César HM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接