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

ibn*_*mys 3 c++ qt

我有一些误解:

#ifndef A_H
#define A_H

#include "B.h"

class A : public B
{
    Q_OBJECT
public:
    A();
};
#endif
Run Code Online (Sandbox Code Playgroud)

A.cpp

#include "A.h"
A::A()
{
    B::ui->blancH2->setValue(2);
}
Run Code Online (Sandbox Code Playgroud)

BH

#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 
Run Code Online (Sandbox Code Playgroud)

作为编译的结果,我有下一个错误:A.cpp:在构造函数'A :: A()'中:无效使用不完整类型'class Ui :: B'Bh:'class Ui :: B'的前向声明

谁能解释为什么我有这个错误?

use*_*779 14

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

namespace Ui {
    class B: public Ui_B {};
}
Run Code Online (Sandbox Code Playgroud)

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

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


Mik*_*our 10

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

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


小智 5

在Qt Creator中,打开对话框形式。选择对话框面板,然后在右侧确保“对象名称”为B。

这将使Qt构建系统知道您的对象是UI对象。否则,您的程序只能将面板作为对象名称对话框来识别。