无效使用不完整的类型Qt

Invalide use of incomplete type Qt

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

我有一个小问题:

finddialog.h

#ifndef FINDDIALOG_H
#define FINDDIALOG_H
class QDialog;
class QWidget;
class QLineEdit;
class QPushButton;
class QCheckBox;
class QLabel;
class FindDialog : public QDialog
{
    Q_OBJECT

public:
    FindDialog(QWidget *parent);
private slots:
    void findClicked();
    void enableFindButton(const QString &text);
signals :
    void findNext(const QString &str, Qt::CaseSensitivity cs);
    void findPrev(const QString &str, Qt::CaseSensitivity cs);
private:
    QLabel *findLabel;
    QLineEdit *textEdit;
    QCheckBox *caseCheckBox;
    QCheckBox *backwCheckBox;
    QPushButton *findButton;
    QPushButton *closeButton;
};
#endif // FINDDIALOG_H

finddialog.c

#include <QtWidgets>
#include "finddialog.h"

FindDialog::FindDialog(QWidget *parent) : QDialog(parent)
{
    QPushButton *button = new QPushButton(this);
}
void FindDialog::findClicked()
{
}
void FindDialog::enableFindButton(const QString &text)
{
}

我收到一个QDialog/QPushButton无效使用不完整类型错误。

我已经在.cpp文件中包含了QtWidget,为什么它不起作用?

(Forward)声明对于基类类型是不够的。你必须提供定义(使QDialog成为一个完整的类型),所以:

#include <QDialog>

在头文件中。请参见基类的正向声明。

根据你发布的代码,我不知道QPushButton不完整的错误是从哪里来的(当然,如果你是#include <QtWidgets>)。

如果你没有#include <QtWidgets>(它有#include <QPushButton>等),你就不能实例化这些不完整的类型,比如:

new QPushButton(this);

同样,这需要一个定义(QPushButton需要的内存大小是多少?调用什么构造函数?只有当编译单元.cpp文件中有定义时,这才是已知的)。

通过在finddialog.h中正向声明QPushButton和其他方法,编译器希望在一些链接文件中找到它们的构造函数和其他方法
#include使其工作所需的头文件。