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

Qt: invalid use of incomplete type and forward declaration

本文关键字:声明 类型 无效 用不完 Qt      更新时间:2023-10-16

我有一些误解:

#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文件希望有人能解释一下~