2013-02-20 1 views
0

Я искал информацию об этой проблеме .. но ни одно из решений, которые я нашел не помог мне, я очень надеюсь, что вы можете HelpMeнедопустимое использование неполного типа/Foward декларации

  • maintabholder.h:

    #ifndef MAINTABHOLDER_H 
    #define MAINTABHOLDER_H 
    
    #include <QMainWindow> 
    
    namespace Ui { 
    class MainTabHolder; 
    } 
    
    class MainTabHolder : public QMainWindow 
    { 
        Q_OBJECT 
    
    public: 
        explicit MainTabHolder(QWidget *parent = 0); 
        ~MainTabHolder(); 
    
    private: 
        Ui::MainTabHolder *ui; 
    }; 
    #endif // MAINTABHOLDER_H 
    
  • maintabholder.cpp:

    #include "maintabholder.h" 
    #include "ui_maintabholder.h" 
    
    MainTabHolder::MainTabHolder(QWidget *parent) : 
        QMainWindow(parent), 
        ui(new Ui::MainTabHolder) 
    { 
        ui->setupUi(this); 
    } 
    
    MainTabHolder::~MainTabHolder() 
    { 
        delete ui; 
    } 
    
  • main.cpp :

    #include "maintabholder.h" 
    #include <QApplication> 
    
    int main(int argc, char *argv[]) 
    { 
        QApplication a(argc, argv); 
        MainTabHolder w; 
        w.show(); 
        return a.exec(); 
    } 
    
  • ui_maintabholder.h #ifndef UI_MAINTABHOLDER_H #define UI_MAINTABHOLDER_H

    #include <QtCore/QVariant> 
    #include <QtWebKitWidgets/QWebView> 
    #include <QtWidgets/QAction> 
    #include <QtWidgets/QApplication> 
    #include <QtWidgets/QButtonGroup> 
    #include <QtWidgets/QHBoxLayout> 
    #include <QtWidgets/QHeaderView> 
    #include <QtWidgets/QPushButton> 
    #include <QtWidgets/QSpacerItem> 
    #include <QtWidgets/QTabWidget> 
    #include <QtWidgets/QVBoxLayout> 
    #include <QtWidgets/QWidget> 
    
    QT_BEGIN_NAMESPACE 
    
    class Ui_Form 
    { 
    public: 
        QHBoxLayout *horizontalLayout; 
        QTabWidget *tabWidget; 
        QWidget *comicViewer; 
        QWidget *comicSearcher; 
        QVBoxLayout *verticalLayout; 
        QHBoxLayout *horizontalLayout_2; 
        QPushButton *pushButton; 
        QSpacerItem *horizontalSpacer; 
        QPushButton *pushButton_2; 
        QWebView *webView; 
    
        void setupUi(QWidget *Form) 
        { 
         if (Form->objectName().isEmpty()) 
          Form->setObjectName(QStringLiteral("Form")); 
         Form->resize(531, 308); 
         horizontalLayout = new QHBoxLayout(Form); 
         horizontalLayout->setObjectName(QStringLiteral("horizontalLayout")); 
         tabWidget = new QTabWidget(Form); 
         tabWidget->setObjectName(QStringLiteral("tabWidget")); 
           comicViewer = new QWidget(); 
         comicViewer->setObjectName(QStringLiteral("comicViewer")); 
         comicViewer->setCursor(QCursor(Qt::ArrowCursor)); 
         tabWidget->addTab(comicViewer, QString()); 
         comicSearcher = new QWidget(); 
         comicSearcher->setObjectName(QStringLiteral("comicSearcher")); 
         verticalLayout = new QVBoxLayout(comicSearcher); 
         verticalLayout->setObjectName(QStringLiteral("verticalLayout")); 
         horizontalLayout_2 = new QHBoxLayout(); 
         horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2")); 
         pushButton = new QPushButton(comicSearcher); 
         pushButton->setObjectName(QStringLiteral("pushButton")); 
    
         horizontalLayout_2->addWidget(pushButton); 
    
         horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); 
    
         horizontalLayout_2->addItem(horizontalSpacer); 
    
         pushButton_2 = new QPushButton(comicSearcher); 
         pushButton_2->setObjectName(QStringLiteral("pushButton_2")); 
         pushButton_2->setEnabled(false); 
    
         horizontalLayout_2->addWidget(pushButton_2); 
    
    
         verticalLayout->addLayout(horizontalLayout_2); 
    
         webView = new QWebView(comicSearcher); 
         webView->setObjectName(QStringLiteral("webView")); 
         webView->setUrl(QUrl(QStringLiteral("about:blank"))); 
    
         verticalLayout->addWidget(webView); 
    
         tabWidget->addTab(comicSearcher, QString()); 
    
         horizontalLayout->addWidget(tabWidget); 
    
    
         retranslateUi(Form); 
    
         tabWidget->setCurrentIndex(1); 
    
    
         QMetaObject::connectSlotsByName(Form); 
        } // setupUi 
    
        void retranslateUi(QWidget *Form) 
        { 
         Form->setWindowTitle(QApplication::translate("Form", "Form", 0)); 
         tabWidget->setTabText(tabWidget->indexOf(comicViewer), QApplication::translate("Form", "Comic Viewer", 0)); 
         pushButton->setText(QApplication::translate("Form", "Go to SubManga", 0)); 
         pushButton_2->setText(QApplication::translate("Form", "Download Comic", 0)); 
         tabWidget->setTabText(tabWidget->indexOf(comicSearcher), QApplication::translate("Form", "Search For Comics", 0)); 
        } // retranslateUi 
    
    }; 
    
    namespace Ui { 
        class Form: public Ui_Form {}; 
    } // namespace Ui 
    
    QT_END_NAMESPACE 
    
    #endif // UI_MAINTABHOLDER_H 
    

ошибки компилятора:

[...]\maintabholder.cpp: In constructor 'MainTabHolder::MainTabHolder(QWidget*)': 
    [...]\maintabholder.cpp:6:16: error: invalid use of incomplete type 'class Ui::MainTabHolder' 
    In file included from [...]\maintabholder.cpp:1:0: 
    [...]\maintabholder.h:7:7: error: forward declaration of 'class Ui::MainTabHolder' 
    [...]\maintabholder.cpp:8:7: error: invalid use of incomplete type 'class Ui::MainTabHolder' 
    In file included from [...]\maintabholder.cpp:1:0: 
    [...]\maintabholder.h:7:7: error: forward declaration of 'class Ui::MainTabHolder' 
    [...]\maintabholder.cpp: In destructor 'virtual MainTabHolder::~MainTabHolder()': 
    [...]\maintabholder.cpp:13:12: warning: possible problem detected in invocation of delete operator: [enabled by default] 
    [...]\maintabholder.cpp:13:12: warning: invalid use of incomplete type 'class Ui::MainTabHolder' [enabled by default] 
    In file included from [...]\maintabholder.cpp:1:0: 
    [...]\maintabholder.h:7:7: warning: forward declaration of 'class Ui::MainTabHolder' [enabled by default] 
    [...]\maintabholder.cpp:13:12: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined 

Можете ли вы дать помощь с этим? Я был бы признателен ...

+1

Покажите нам файл 'ui_maintabholder.h' и скажите, в какой системе компиляции (IDE, make util и т. Д.) Вы используете – borisbn

+3

Угадайте, использует ли' ui_maintabholder.h' тот же защитник, что и 'maintabholder.h '? Тот факт, что вы используете имя класса в качестве защитника включения, вызывает у меня подозрение в заголовке для класса с одинаковым именем в другом пространстве имен. – simonc

+1

Пара вопросов: Почему вы включаете 'MainTabHolder' в пространство имен? Почему вы хотите, чтобы экземпляр его был членом класса? Если вы сконструируете его так, как вы делаете в списке инициализаторов, это приведет к бесконечной рекурсии (если охватывающий класс в пространстве имен является тем, который находится за пределами пространства имен). Если вам требуется форвардная декларация, достаточно просто 'class MainTabHolder;'. – Mahesh

ответ

3

Вы используете файл uic с Qt; вы должны убедиться, что этот инструмент успешно сгенерирует файл, например, проверив вывод сборки и сам файл. Кроме того, убедитесь, что он находится в файле *.pro (то есть, что maintabholder.h помечен для обработки uic).

Я Personnally советую использовать multiple inheritance method для Ui:

// in maintabholder.h 
// ... 
#include "ui_maintabholder.h" 

class MainTabHolder : public QMainWindow, public Ui::MainTabHolder 
{ 
    // ... 
}; 

Simpler использовать, и если у вас есть проблемы с файлом ui_*.h ошибка является более явным.

Вы должны разместить ui_maintabholder.h.

+0

эй спасибо за открытие моих глаз !, ну, я думаю, проблема в том, что файл ui, который я использовал, я сделал его для тестирования в другом проекте, и я просто скопировал этот файл на это, имена переменных много разные ... я постараюсь исправить свои ошибки .. им жаль, что у вас время ... им просто нуб, кстати спасибо большое – lennin92

+0

Нет проблем! Если этот ответ вам помог, вы можете [принять] (http://stackoverflow.com/faq#howtoask) его. Вы также можете повысить, если вы так чувствуете :) – Synxis

0

Вы включили ui define head в свой .cpp-файл и определили частный член «Ui :: MainTabHolder * ui;» в вашем .h файле, поэтому вам нужно добавить опережающее объявление в вашем файле .h (maintabholder.h :) до вашего класса Defination:

class Ui_MainTabHolder; 

здесь Ui_MainTabHolder Ваше имя класса Ui, проверьте свой проект исправьте.