Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c++

qt

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
like image 1000
Hell Man Avatar asked Feb 14 '14 15:02

Hell Man


4 Answers

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.

like image 66
Kirell Avatar answered Oct 31 '22 22:10

Kirell


I'm reading the same book. There are 2 things that need to be 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.

like image 20
dalilander Avatar answered Oct 31 '22 20:10

dalilander


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

like image 3
Prabindh Avatar answered Oct 31 '22 22:10

Prabindh


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.

like image 2
Mario García Avatar answered Oct 31 '22 20:10

Mario García