Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: von_Manstein от Август 05, 2011, 23:34



Название: Invalid use of incomplete type.
Отправлено: von_Manstein от Август 05, 2011, 23:34
Доброго вечера всем.

Столкнулся с проблемой. Не могу собрать интерфейс. Ошибка простая, по-видимому, но никак найти не могу. Буду благодарен, если растолкуете. Сорцы выкладываю и скрины.

main.cpp
Код:
#include <QtGui>
#include "myinterfacemaker.h"

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    MyInterfaceMaker theInterface;
    theInterface.showFullScreen();

    return app.exec();
}

myinterfacemaker.h
Код:
#ifndef MYINTERFACEMAKER_H
#define MYINTERFACEMAKER_H

#include <QWidget>

class QLineEdit;
class QListWidget;
class QPushButton;
class QVBoxLayout;
class QGridLayout;

class MyInterfaceMaker : public QWidget
{
    Q_OBJECT

private:

QLineEdit*   pSearch;
QListWidget* pList;
QPushButton* pNew;
QPushButton* pNull1;
QPushButton* pNull2;
QPushButton* pExit;
QVBoxLayout* pMainLayer;
QGridLayout* pButtonGrid;

public:

    MyInterfaceMaker(QWidget* pwgt = 0 );

signals:

public slots:

};

myinterfacemaker.cpp
Код:
#include "myinterfacemaker.h"

MyInterfaceMaker::MyInterfaceMaker(QWidget* pwgt/*=0*/) : QWidget(pwgt)
{
    // Инициализация указателей
    pSearch = new QLineEdit;
    pList = new QListWidget;
    pNew = new QPushButton("New note");
    pNull1 = new QPushButton("*****");
    pNull2 = new QPushButton("*****");
    pExit = new QPushButton("Exit");
    pMainLayer = new QVBoxLayout;
    pButtonGrid = new QGridLayout;

    // Заполнение слоёв
    pButtonGrid->addWidget(pNew, 0, 0);
    pButtonGrid->addWidget(pNull1, 0, 1);
    pButtonGrid->addWidget(pNull2, 1, 0);
    pButtonGrid->addWidget(pExit, 1, 1);

    pMainLayer->addWidget(pSearch);
    pMainLayer->addWidget(pList);
    pMainLayer->addLayout(pButtonGrid);

    setLayout(pMainLayer);
};

И скрин с ошибкой


Название: Re: Invalid use of incomplete type.
Отправлено: LisandreL от Август 05, 2011, 23:44
#include <QtGui> не подключает автоматически QLineEdit и т.д.


Название: Re: Invalid use of incomplete type.
Отправлено: von_Manstein от Август 05, 2011, 23:45
Было такое предположение, тогда все заголовки подключать в хедере отдельно?


Название: Re: Invalid use of incomplete type.
Отправлено: von_Manstein от Август 05, 2011, 23:49
Убрал

class QLineEdit;
class QListWidget;
class QPushButton;
class QVBoxLayout;
class QGridLayout;

Написал

#include <QWidget>
#include <QLineEdit>
#include <QListWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QGridLayout>

Заработало! Может, есть более простой путь?

Спасибо!


Название: Re: Invalid use of incomplete type.
Отправлено: Vass от Август 06, 2011, 00:30
В хедере заголовки не надо, оставьте просто декларацию, заголовки нужны в cpp,
заголовки в хедере, увеличивают время сборки/пересборки, если в кратце


Название: Re: Invalid use of incomplete type.
Отправлено: von_Manstein от Август 06, 2011, 00:35
class QLineEdit;
class QListWidget;
class QPushButton;
class QVBoxLayout;
class QGridLayout; - так не работает. На скрине ошибки.

Вы предлагаете это:
#include <QWidget>
#include <QLineEdit>
#include <QListWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QGridLayout> - переместить в cpp-файл.

В итоге получается, что я в хедере оставляю просто декларацию, а в cpp-файле подключаю недостающие заголовки и так будет правильнее, так я понял?


Название: Re: Invalid use of incomplete type.
Отправлено: developer от Август 06, 2011, 07:20
Да


Название: Re: Invalid use of incomplete type.
Отправлено: von_Manstein от Август 06, 2011, 07:35
Спасибо!