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
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.
I'm reading the same book. There are 2 things that need to be fixed to get this sample to work.
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
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
Delete all the old makefiles and find.pro.user and rebuild the project.
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.
Errors in QtGui for QWidget definition. Add Qt += widgets in the .pro file as already suggested.
Some like #include " QGraphicsItem ", need QtWidgets/QGraphicsItem, QtWidgets/QVBoxLayout
QString::toAscii() == QString::toLatin1() in xgxperfserver.cpp
Qt += widgets needed, to avoid linking errors for all widgets
Project ERROR: Unknown module(s) in QT: svg == svg is not default in Qt, needs qtsvg
QApplication == QtWidgets/QApplication
" QtWidgets/QGraphicsProxyWidget " needs to be declared explicitly
include " QtWidgets/QGraphicsDropShadowEffect " to be declared explicitly
include " QDebug " to be declared explicitly
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
Add QtWidgets, #include " QtWidgets/QGraphicsEffect "
Add QtWidgets, #include " QtWidgets/QGraphicsView "
include " QtWidgets/QPushButton "
QGraphicsItem::Scale becomes QGraphicsItem::setScale
QApplication::sendEvent becomes QCoreApplication::sendEvent
QGraphicsDropShadowEffect becomes QtWidgets/QGraphicsDropShadowEffect
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With