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

时间:2014-01-14 12:27:56

标签: c++ qt

我有一些误解:

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

有人可以解释为什么我有这个错误吗?

4 个答案:

答案 0 :(得分:14)

检查ui_B.h。最后,你应该看到

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

如果不是,您可以在Qt Designer中打开.ui文件,选择您的小部件,在Object Inspector中,将'Object'下的字符串更改为'B'。如果您的小部件是对话框,则默认值为“对话框”。

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

答案 1 :(得分:10)

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

您需要包含定义Ui::B的标头;或者,或许,给B成员函数做任何A需要做的事情,而不是直接对B的成员进行处理。

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

实际上,当我更改了“MainWindow”的名称时,我遇到了这个问题。到了LoginWindow&#39;在整个应用程序建立之后。这对每个人都有用,但是将其名称更改为原始名称(在启动项目时填写)可以为我工作。 还是不知道Qt的.ui文件,希望有人能解释这个〜