Qt error: Invalid use of incomplete type "QLabel class"

I am trying to compile the following program using QtCreater, but I am getting a lot of errors in this program. I got this program from a book, and I cannot figure out where the error is. Can someone help debug this program.

Here is 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(); } 

I get the following errors:

 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 
+6
source share
5 answers

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

 QT += widgets 

Change all instances

 #include <QtGui> 

to

 #include <QtWidgets> 

But it’s much better to include the file you want, rather than the entire QtGui or QtWidgets.

+8
source

I am reading the same book. There are two things that need to be fixed in order to make this pattern work.

  • The advanced class declarations in the findDialog.h header file do not work, so the constructor is for QLabel, etc. not found. Replace each class with the following #include as follows. (QHBoxLayout and QVBoxLayout are not needed in the finddialog.h file, but for convenience, I moved them so that all the necessary included objects 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 
  • Edit the .pro file:

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

+5
source

When upgrading from Qt4, you need to change many elements. The following is a list based on my experience (from http://www.gpupowered.org/node/23 ). This is not a complete list.

  • Errors in QtGui for determining QWidget. Add Qt + = widgets to the .pro file, as already suggested.

  • Some like #include "QGraphicsItem", need QtWidgets / QGraphicsItem, QtWidgets / QVBoxLayout

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

  • Qt + = necessary widgets to avoid error binding for all widgets

  • Project ERROR: Unknown module in QT: svg == svg is not the default value in Qt, qtsvg is required

  • QApplication == QtWidgets / QApplication

  • "QtWidgets / QGraphicsProxyWidget" must be explicitly specified

  • enable "QtWidgets / QGraphicsDropShadowEffect" to be declared explicitly

  • enable "QDebug" for explicit indication

  • If the project includes .ui files and needs ui_mainwindow.h, you also need to add QT + = widgets to get uic for calling ui files.

  • Add QtWidgets, #include "QtWidgets / QGraphicsEffect"

  • Add QtWidgets, #include "QtWidgets / QGraphicsView"

  • enable "QtWidgets / QPushButton"

  • QGraphicsItem :: Scale will become QGraphicsItem :: setScale

  • QApplication :: sendEvent becomes QCoreApplication :: sendEvent

  • QGraphicsDropShadowEffect becomes QtWidgets / QGraphicsDropShadowEffect

+3
source

I also read the same book. The problem comes from Qt versions. The book is written for Qt4 while you are trying to use Qt5. The easiest way to solve this is to change 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 do not need to include more, and now it should compile without errors. For more information about this, check out the Qt documentation about moving from Qt4 to Qt5 .

+1
source

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

1) Add these two lines to find.pro:

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

2) Save the forward declarations in find.h and use the following actions in find.cpp:

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

All Articles