2

在这段代码中:

#ifndef WINDOW_H
#define WINDOW_H

#include <QWidget>

class QPushButton;
class Window : public QWidget
{
public:
    explicit Window(QWidget *parent = 0);
private:
    QPushButton *m_button;
};

#endif // WINDOW_H

为什么我需要转发类 QPushButton 声明?如果我不这样做会发生什么?因为我已经删除了它并且程序已经编译

这是此标头的 .cpp 文件:

#include "window.h"

#include <QPushButton>

Window::Window(QWidget *parent) :
    QWidget(parent)
{
    // Set size of the window
    setFixedSize(100, 50);

    // Create and position the button
    m_button = new QPushButton("Hello World", this);
    m_button->setGeometry(10, 10, 80, 30);
}
4

1 回答 1

1

您在QPushButton类的声明中使用了指向 a 的指针Window。这就是为什么你必须#include <QPushButton>在使用它之前,或者至少告诉编译器它存在并且它在你的代码中用前向声明进一步声明。如果从头文件中删除前向声明时没有任何反应,是因为在包含或声明它之前的某个地方。可能是 qwidget.h 或其包含的头文件之一正在为您执行此操作……或者在您使用 Qt 设计器表单的情况下由“Qt 用户界面编译器”生成的 .h 文件。

但正如@chris 所说:“不要指望标题为您包含其他标题。”

明确地这样做没有额外的工作。

于 2013-08-10T02:19:18.440 回答