如何在QT中使用小部件的对象

时间:2015-09-22 11:51:39

标签: c++ qt pointers

在我的应用程序中,我有两个名为widgetform的小部件。但是,如果我尝试在窗口小部件widget头文件中创建窗口小部件form的指针对象,则会给出类似“窗体不命名类型”的错误。请参考下面使用的代码:

main.cpp

#include <QtGui/QApplication>
#include "widget.h"
#include "form.h"
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  Widget *w = new Widget();
   w->show();
  return a.exec();
 }

widget.cpp

#include "widget.h"
Widget::Widget(QWidget *parent) :QWidget(parent)
{
  setupUi(this);
}

widget.h

 #ifndef WIDGET_H
 #define WIDGET_H

 #include "ui_widget.h"
 #include "form.h"
 class Widget : public QWidget, private Ui::Widget
 {
    Q_OBJECT
    public:
        explicit Widget(QWidget *parent = 0);
        Form *f ;//i try to create pointer object for Form
 };
 #endif // WIDGET_H

form.cpp

 #include "form.h"
 #include "widget.h"

 Form::Form(QWidget *parent) :QWidget(parent)
 {
   setupUi(this);
 }

form.h

#ifndef FORM_H
#define FORM_H

#include "ui_form.h"
#include "widget.h"
class Form : public QWidget, private Ui::Form
{
  Q_OBJECT
  public:
       explicit Form(QWidget *parent = 0);
};

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您应该在widget.h中而不是Form form.h中放置类#include的前向声明。问题是你包括form.h,其中包括widget.h,尝试包含form.h,但由于include guard而不能。因此,在widget.h中,类Form是未定义的,尽管它看起来要定义用户。

答案 1 :(得分:1)

问题在于widget.h包含form.h,其中包含widget.h。标题保护(#ifndef)导致跳过第二个包含。

为了在标题中声明一个指针变量,前向声明就足够了:

<强> SomeClass.h

 class Form; // forward declaration

 class SomeClass {
 public:
    SomeClass();
    // ...
 private:
    Form* form; // pointer to Form
 };

<强> SomeClass.cpp

SomeClass::SomeClass() 
{
     form = new Form();
}