簡體   English   中英

無效使用不完整的類型/前瞻性聲明

[英]invalid use of incomplete type/ foward declaration of

我一直在尋找有關此問題的信息..但是我發現的任何解決方案都沒有幫助我,我真的希望您能提供幫助

  • 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#定義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

你能幫忙嗎? 我會很感激...

您正在使用uic從Qt生成的文件; 您應該通過例如檢查構建輸出和文件本身來驗證此工具是否成功生成了文件。 另外,檢查它是否在*.pro文件中(即, maintabholder.h被標記為由uic處理)。

我個人建議對ui使用多重繼承方法

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

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

使用更簡單,如果ui_*.h文件有問題,則錯誤更明顯。

您應該發布ui_maintabholder.h

您已在.cpp文件中包含ui定義頭,並定義了一個私有成員“ Ui :: MainTabHolder * ui;”。 在.h文件中,因此您需要在.h文件(maintabholder.h :)中添加前向聲明:

class Ui_MainTabHolder;

這里Ui_MainTabHolder是您的Ui類名稱,請檢查您自己的項目是否正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM