Qt error: invalid use of incomplete type 'class QLabel'

匿名 (未验证) 提交于 2019-12-03 02:59:02

问题:

I'm trying to compile the following program using QtCreater but I get a lots of errors in this program. I got this program from a book and I'm not able to figure out where the error is. Can someone help debug this program.

Here is the FindDialog.h

#ifndef FINDDIALOG_H #define FINDDIALOG_H  #include <QDialog>  class QCheckbox; class QLabel; class QLineEdit; class QPushButton;  class FindDialog : public QDialog {     Q_OBJECT  public:     FindDialog(QWidget *parent = 0);  signals:     void findNext(const QString &str, Qt::CaseSensitivity cs);     void findPrevious(const QString &str, Qt::CaseSensitivity cs);  private slots:     void findClicked();     void enableFindButton(const QString &text);  private:     QLabel *label;     QLineEdit *lineEdit;     QCheckbox *caseCheckBox;     QCheckbox *backwardCheckBox;     QPushButton *findButton;     QPushButton *closeButton; };  #endif 

FindDialog.cpp

#include <QtGui>  #include "finddialog.h"  FindDialog::FindDialog(QWidget *parent) : QDialog(parent) {     label = new QLabel(tr("Find &what"));     lineEdit = new QLineEdit;     label->setBuddy(lineEdit);     caseCheckBox = new QCheckbox(tr("Match &case"));     backwardCheckBox = new QCheckbox(tr("Search &backward"));     findButton = new QPushButton(tr("&Find"));     findButton->setDefault(true);     findButton->setEnabled(false);     closeButton = new QPushButton(tr("Close"));      connect(lineEdit, SIGNAL(textChanged(const QString &)),              this, SLOT(enableFindButton(const QString &)));      connect(findButton, SIGNAL(clicked()),             this, SLOT(findClicked()));      connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));      QHBoxLayout *topLeftLayout = new QHBoxLayout;     topLeftLayout->addWidget(label);     topLeftLayout->addWidget(lineEdit);      QVBoxLayout *leftLayout = new QVBoxLayout;     leftLayout->addLayout(topLeftLayout);     leftLayout->addWidget(caseCheckBox);     leftLayout->addWidget(backwardCheckBox);      QVBoxLayout *rightLayout = new QVBoxLayout;     rightLayout->addWidget(findButton);     rightLayout->addWidget(closeButton);     rightLayout->addStretch();      QHBoxLayout *mainLayout = new QHBoxLayout;     mainLayout->addLayout(leftLayout);     mainLayout->addLayout(rightLayout);     setLayout(mainLayout);      setWindowTitle(tr("Find"));     setFixedHeight(sizeHint().height()); }  void FindDialog::findClicked() {     QString text = lineEdit->text();     Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitivity                                                        : Qt::CaseInsensitive;     if(backwardCheckBox->isChecked()) {         emit findPrevious(text, cs);     } else {         emit findNext(text, cs);     } }  void FindDialog::enableFindButton(const QString &text) {     findButton->setEnabled(!text.isEmpty()); } 

main.cpp

#include <QApplication>  #include "findDialog.h"  int main (int argc, char *argv[]) {     QApplication app(argc, argv);     FindDialog *dialog = new FindDialog;     dialog->show();     return app.exec(); } 

The errors I get are the following:

finddialog.cpp:21:32: note: candidates are: In file included from /usr/include/qt5/QtCore/qabstractanimation.h:45:0,                  from /usr/include/qt5/QtCore/QtCore:4,                  from /usr/include/qt5/QtGui/QtGui:4,                  from finddialog.cpp:1: /usr/include/qt5/QtCore/qobject.h:199:36: note: static QMetaObject::Connection QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)      static QMetaObject::Connection connect(const QObject *sender, const char *signal,                                     ^ /usr/include/qt5/QtCore/qobject.h:199:36: note:   no known conversion for argument 1 from ‘QPushButton*’ to ‘const QObject*’ /usr/include/qt5/QtCore/qobject.h:202:36: note: static QMetaObject::Connection QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)      static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,                                     ^ /usr/include/qt5/QtCore/qobject.h:202:36: note:   no known conversion for argument 1 from ‘QPushButton*’ to ‘const QObject*’ /usr/include/qt5/QtCore/qobject.h:418:32: note: QMetaObject::Connection QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const  inline QMetaObject::Connection QObject::connect(const QObject *asender, const char *asignal,                                 ^ /usr/include/qt5/QtCore/qobject.h:418:32: note:   no known conversion for argument 1 from ‘QPushButton*’ to ‘const QObject*’ /usr/include/qt5/QtCore/qobject.h:215:43: note: template<class Func1, class Func2> static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType)      static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,                                            ^ /usr/include/qt5/QtCore/qobject.h:215:43: note:   template argument deduction/substitution failed: /usr/include/qt5/QtCore/qobject.h: In substitution of ‘template<class Func1, class Func2> static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType) [with Func1 = const char*; Func2 = const char*]’: finddialog.cpp:21:32:   required from here /usr/include/qt5/QtCore/qobject.h:215:43: error: no type named ‘Object’ in ‘struct QtPrivate::FunctionPointer<const char*>’ /usr/include/qt5/QtCore/qobject.h:245:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)              connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)              ^ /usr/include/qt5/QtCore/qobject.h:245:13: note:   template argument deduction/substitution failed: finddialog.cpp:21:32: note:   candidate expects 3 arguments, 4 provided        this, SLOT(findClicked()));                                 ^ In file included from /usr/include/qt5/QtCore/qabstractanimation.h:45:0,                  from /usr/include/qt5/QtCore/QtCore:4,                  from /usr/include/qt5/QtGui/QtGui:4,                  from finddialog.cpp:1: /usr/include/qt5/QtCore/qobject.h:268:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)              connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)              ^ /usr/include/qt5/QtCore/qobject.h:268:13: note:   template argument deduction/substitution failed: finddialog.cpp:21:32: note:   candidate expects 3 arguments, 4 provided        this, SLOT(findClicked()));                                 ^ finddialog.cpp:23:61: error: no matching function for call to ‘FindDialog::connect(QPushButton*&, const char [11], FindDialog* const, const char [9])’   connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));                                                              ^ finddialog.cpp:23:61: note: candidates are: In file included from /usr/include/qt5/QtCore/qabstractanimation.h:45:0,                  from /usr/include/qt5/QtCore/QtCore:4,                  from /usr/include/qt5/QtGui/QtGui:4,                  from finddialog.cpp:1: /usr/include/qt5/QtCore/qobject.h:199:36: note: static QMetaObject::Connection QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)      static QMetaObject::Connection connect(const QObject *sender, const char *signal,                                     ^ /usr/include/qt5/QtCore/qobject.h:199:36: note:   no known conversion for argument 1 from ‘QPushButton*’ to ‘const QObject*’ /usr/include/qt5/QtCore/qobject.h:202:36: note: static QMetaObject::Connection QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)      static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,                                     ^ /usr/include/qt5/QtCore/qobject.h:202:36: note:   no known conversion for argument 1 from ‘QPushButton*’ to ‘const QObject*’ /usr/include/qt5/QtCore/qobject.h:418:32: note: QMetaObject::Connection QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const  inline QMetaObject::Connection QObject::connect(const QObject *asender, const char *asignal,                                 ^ /usr/include/qt5/QtCore/qobject.h:418:32: note:   no known conversion for argument 1 from ‘QPushButton*’ to ‘const QObject*’ /usr/include/qt5/QtCore/qobject.h:215:43: note: template<class Func1, class Func2> static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType)      static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,                                            ^ /usr/include/qt5/QtCore/qobject.h:215:43: note:   template argument deduction/substitution failed: /usr/include/qt5/QtCore/qobject.h: In substitution of ‘template<class Func1, class Func2> static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType) [with Func1 = const char*; Func2 = const char*]’: finddialog.cpp:23:61:   required from here /usr/include/qt5/QtCore/qobject.h:215:43: error: no type named ‘Object’ in ‘struct QtPrivate::FunctionPointer<const char*>’ /usr/include/qt5/QtCore/qobject.h:245:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)              connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)              ^ /usr/include/qt5/QtCore/qobject.h:245:13: note:   template argument deduction/substitution failed: finddialog.cpp:23:61: note:   candidate expects 3 arguments, 4 provided   connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));                                                              ^ In file included from /usr/include/qt5/QtCore/qabstractanimation.h:45:0,                  from /usr/include/qt5/QtCore/QtCore:4,                  from /usr/include/qt5/QtGui/QtGui:4,                  from finddialog.cpp:1: /usr/include/qt5/QtCore/qobject.h:268:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2)              connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)              ^ /usr/include/qt5/QtCore/qobject.h:268:13: note:   template argument deduction/substitution failed: finddialog.cpp:23:61: note:   candidate expects 3 arguments, 4 provided   connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));                                                              ^ finddialog.cpp:25:2: error: ‘QHBoxLayout’ was not declared in this scope   QHBoxLayout *topLeftLayout = new QHBoxLayout;   ^ finddialog.cpp:25:15: error: ‘topLeftLayout’ was not declared in this scope   QHBoxLayout *topLeftLayout = new QHBoxLayout;                ^ finddialog.cpp:25:35: error: expected type-specifier before ‘QHBoxLayout’   QHBoxLayout *topLeftLayout = new QHBoxLayout;                                    ^ finddialog.cpp:25:35: error: expected ‘;’ before ‘QHBoxLayout’ finddialog.cpp:29:2: error: ‘QVBoxLayout’ was not declared in this scope   QVBoxLayout *leftLayout = new QVBoxLayout;   ^ finddialog.cpp:29:15: error: ‘leftLayout’ was not declared in this scope   QVBoxLayout *leftLayout = new QVBoxLayout;                ^ finddialog.cpp:29:32: error: expected type-specifier before ‘QVBoxLayout’   QVBoxLayout *leftLayout = new QVBoxLayout;                                 ^ finddialog.cpp:29:32: error: expected ‘;’ before ‘QVBoxLayout’ finddialog.cpp:34:15: error: ‘rightLayout’ was not declared in this scope   QVBoxLayout *rightLayout = new QVBoxLayout;                ^ finddialog.cpp:34:33: error: expected type-specifier before ‘QVBoxLayout’   QVBoxLayout *rightLayout = new QVBoxLayout;                                  ^ finddialog.cpp:34:33: error: expected ‘;’ before ‘QVBoxLayout’ finddialog.cpp:39:15: error: ‘mainLayout’ was not declared in this scope   QHBoxLayout *mainLayout = new QHBoxLayout;                ^ finddialog.cpp:39:32: error: expected type-specifier before ‘QHBoxLayout’   QHBoxLayout *mainLayout = new QHBoxLayout;                                 ^ finddialog.cpp:39:32: error: expected ‘;’ before ‘QHBoxLayout’ finddialog.cpp: In member function ‘void FindDialog::findClicked()’: finddialog.cpp:50:25: error: invalid use of incomplete type ‘class QLineEdit’   QString text = lineEdit->text();                          ^ In file included from finddialog.cpp:3:0: finddialog.h:8:7: error: forward declaration of ‘class QLineEdit’  class QLineEdit;        ^ finddialog.cpp:51:39: error: invalid use of incomplete type ‘class QCheckbox’   Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitivity                                        ^ In file included from finddialog.cpp:3:0: finddialog.h:6:7: error: forward declaration of ‘class QCheckbox’  class QCheckbox;        ^ finddialog.cpp:52:17: error: expected primary-expression before ‘:’ token                  : Qt::CaseInsensitive;                  ^ finddialog.cpp:53:21: error: invalid use of incomplete type ‘class QCheckbox’   if(backwardCheckBox->isChecked()) {                      ^ In file included from finddialog.cpp:3:0: finddialog.h:6:7: error: forward declaration of ‘class QCheckbox’  class QCheckbox;        ^ finddialog.cpp: In member function ‘void FindDialog::enableFindButton(const QString&)’: finddialog.cpp:62:12: error: invalid use of incomplete type ‘class QPushButton’   findButton->setEnabled(!text.isEmpty());             ^ In file included from /usr/include/qt5/QtWidgets/QDialog:1:0,                  from finddialog.h:4,                  from finddialog.cpp:3: /usr/include/qt5/QtWidgets/qdialog.h:52:7: error: forward declaration of ‘class QPushButton’  class QPushButton;        ^ make: *** [finddialog.o] Error 1 

回答1:

The error should come from your .pro file since your are using Qt5 you should include:

QT += widgets 

Change all instances of

#include <QtGui> 

to

#include <QtWidgets> 

But it is much better to include the file you need instead of the whole QtGui or QtWidgets.



回答2:

I'm reading the same book. There are 2 things that need to fixed to get this sample to work.

  1. The 'class' forward declarations in the findDialog.h header file do not work, so no constructor for QLabel etc can be found. Replace each class with the corresponding #include as follows. (The QHBoxLayout and QVBoxLayout are not needed in the finddialog.h file but for convenience I moved those too so that all required includes are in the same place.)

    #include < QDialog> #include < QCheckBox>    //class QCheckBox;   #include < QLabel>       //class QLabel;      #include < QLineEdit>    //class QLineEdit;   #include < QPushButton>  //class QPushButton;  #include < QHBoxLayout>   //in the finddialog.cpp #include < QVBoxLayout>   //in the finddialog.cpp 
  2. Edit the .pro file to this:

    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  TARGET   = find   TEMPLATE = app  HEADERS  = finddialog.h  SOURCES  = finddialog.cpp \                 main.cpp 
  3. Delete all the old makefiles and find.pro.user and rebuild the project.



回答3:

You need to change many items when moving from Qt4. Below is a list based on my experience (from http://www.gpupowered.org/node/23). This is not a complete list by any means.

  1. Errors in QtGui for QWidget definition. Add Qt += widgets in the .pro file as already suggested.

  2. Some like #include " QGraphicsItem ", need QtWidgets/QGraphicsItem, QtWidgets/QVBoxLayout

  3. QString::toAscii() == QString::toLatin1() in xgxperfserver.cpp

  4. Qt += widgets needed, to avoid linking errors for all widgets

  5. Project ERROR: Unknown module(s) in QT: svg == svg is not default in Qt, needs qtsvg

  6. QApplication == QtWidgets/QApplication

  7. " QtWidgets/QGraphicsProxyWidget " needs to be declared explicitly

  8. include " QtWidgets/QGraphicsDropShadowEffect " to be declared explicitly

  9. include " QDebug " to be declared explicitly

  10. If project includes .ui files, and needs the ui_mainwindow.h, also need to add QT += widgets, to get uic to be called to generate ui files

  11. Add QtWidgets, #include " QtWidgets/QGraphicsEffect "

  12. Add QtWidgets, #include " QtWidgets/QGraphicsView "

  13. include " QtWidgets/QPushButton "

  14. QGraphicsItem::Scale becomes QGraphicsItem::setScale

  15. QApplication::sendEvent becomes QCoreApplication::sendEvent

  16. QGraphicsDropShadowEffect becomes QtWidgets/QGraphicsDropShadowEffect



回答4:

I am also reading the same book. The problem comes from the versions of Qt. The book is written for Qt4, while you are trying to use Qt5. The easiest way to solve it is by changing the following lines.

In FindDialog.pro add:

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

and in FindDialog.cpp change #include <QtGui> for the line:

#include <QtWidgets> 

You don't need to include more and it should compile without errors now. For more info about it, check the Qt documentation about the transition from Qt4 to Qt5.



回答5:

For me, with qmake -v reporting QMake version 3.0 and Qt version 5.3.0, it worked the following:

1) Add these two lines to find.pro:

QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

2) Keep the forward declarations in find.h, and use the includes below in find.cpp:

#include <QCheckBox> #include <QLineEdit> #include <QLabel> #include <QPushButtons>  #include <QHBoxLayout> #include <QVBoxLayout> 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!