PDA

View Full Version : Qt4 Books Guide problem, cant run programs on Qt5



hot_tea
16th June 2013, 04:16
i downloaded a book about qt programming but its outdated because its version is something like qt4. while i got the latest Qt5.0.2 creator and compiler which i downloaded from qt-project.org/downloads. I've read from chapter 1 and everything seems to work fine but when i reached chapter 2, which includes header, thebody and the main, i received a lot of errors so here is my code...im running windows

in the creator i clicked--File->New Project->Other Project->Empty Qt Project->then i named it finddialog->next2x->Finished

then in the project named finddialog i right clicked it->Add New->C++ Source File->i named it main.cpp->then finished.

then in the project named finddialog again i right clicked it->Add New->C++ Class->class name: finddialog, base class: i chose QWidget->then Finished.

so here is the code in the header file...


#ifndef FINDDIALOG_H
2 #define FINDDIALOG_H

3 #include <QDialog>

4 class QCheckBox;
5 class QLabel;
6 class QLineEdit;
7 class QPushButton;
8 class FindDialog : public QDialog
9 {
10 Q_OBJECT

11 public:
12 FindDialog(QWidget *parent = 0);
13 signals:
14 void findNext(const QString &str, Qt::CaseSensitivity cs);
15 void findPrevious(const QString &str, Qt::CaseSensitivity cs);
16 private slots:
17 void findClicked();
18 void enableFindButton(const QString &text);

19 private:
20 QLabel *label;
21 QLineEdit *lineEdit;
22 QCheckBox *caseCheckBox;
23 QCheckBox *backwardCheckBox;
24 QPushButton *findButton;
25 QPushButton *closeButton;
26 };

27 #endif


then in the finddialog.cpp here is the code


1 #include <QtGui>

2 #include "finddialog.h"
3 FindDialog::FindDialog(QWidget *parent)
4 : QDialog(parent)
5 {
6 label = new QLabel(tr("Find &what:"));
7 lineEdit = new QLineEdit;
8 label->setBuddy(lineEdit);

9 caseCheckBox = new QCheckBox(tr("Match &case"));
10 backwardCheckBox = new QCheckBox(tr("Search &backward"));

11 findButton = new QPushButton(tr("&Find"));
12 findButton->setDefault(true);
13 findButton->setEnabled(false);

14 closeButton = new QPushButton(tr("Close"));

15 connect(lineEdit, SIGNAL(textChanged(const QString &)),
16 this, SLOT(enableFindButton(const QString &)));
17 connect(findButton, SIGNAL(clicked()),
18 this, SLOT(findClicked()));
19 connect(closeButton, SIGNAL(clicked()),
20 this, SLOT(close()));
21 QHBoxLayout *topLeftLayout = new QHBoxLayout;
22 topLeftLayout->addWidget(label);
23 topLeftLayout->addWidget(lineEdit);

24 QVBoxLayout *leftLayout = new QVBoxLayout;
25 leftLayout->addLayout(topLeftLayout);
26 leftLayout->addWidget(caseCheckBox);
27 leftLayout->addWidget(backwardCheckBox);

28 QVBoxLayout *rightLayout = new QVBoxLayout;
29 rightLayout->addWidget(findButton);
30 rightLayout->addWidget(closeButton);
31 rightLayout->addStretch();

32 QHBoxLayout *mainLayout = new QHBoxLayout;
33 mainLayout->addLayout(leftLayout);
34 mainLayout->addLayout(rightLayout);
35 setLayout(mainLayout);
36 setWindowTitle(tr("Find"));
37 setFixedHeight(sizeHint().height());
38 }
39 void FindDialog::findClicked()
40 {
41 QString text = lineEdit->text();
42 Qt::CaseSensitivity cs =
43 caseCheckBox->isChecked() ? Qt::CaseSensitive
44 : Qt::CaseInsensitive;
45 if (backwardCheckBox->isChecked()) {
46 emit findPrevious(text, cs);
47 } else {
48 emit findNext(text, cs);
49 }
50 }

51 void FindDialog::enableFindButton(const QString &text)
52 {
53 findButton->setEnabled(!text.isEmpty());
54 }


and the last one in is the main.cpp here it is....


1 #include <QWidgets/QApplication>

2 #include "finddialog.h"

3 int main(int argc, char *argv[])
4 {
5 QApplication app(argc, argv);
6 FindDialog *dialog = new FindDialog;
7 dialog->show();
8 return app.exec();
9 }


When run and compile this i got 46 errors.
In the .pro file i did type this QT += widgets

Did i miss something more important? The codes the i entered above will surely works on qt4 but im currently running the latest Qt5.0.2 packaged which i thought will not give me problems...

saman_artorious
16th June 2013, 08:54
include

#include<QtWidgets>

instead of

#include <QtGui/QWidget>

and omit what you added in the .pro file.

Zlatomir
16th June 2013, 09:09
@saman_artorious a better way is to avoid including the module and include a the header for each needed class and he shouldn't omit the QT += widgets from .pro file, that is needed to add the library to linkage stage (so the module into the include lines is not enough to replace the adding to QT into the qmake project file)

@hot_tea see this (http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5) documentation page, basically the classes derived from QWidget are moved into widgets module so the #include <QtGui> wont include headers for the classes you need, to solve this problem include the headers of the widgets you need not the module (and if you correctly add QT += widgets into the .pro file the source will become compilable with both Qt4 and Qt5)
So into the finddialog.cpp replace #include <QtGui>


//#include <QtGui> - don't use this
#include <QCheckBox> //include header for each individual qt class you use
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include "finddialog.h"


And also when you ask for help please tell us the errors you get, usually we can't compile your code, so if there are more issues tell us the errors ;)

hot_tea
16th June 2013, 13:45
Ok so i've tried what you've said and the errors lessened, so i decided to take pictures about my problem, here it is hope you can help me now..

this is in the header9158


this is in the finddialog.cpp Top portion: 9159


this is the continuation of finddialog.cpp Bottom portion: 9160


and then the main.cpp which includes the errors: 9161

hope you can help me....

Zlatomir
16th June 2013, 14:13
Most of the errors are related to the missing includes for headers for QVBoxLayout and QHBoxLayout so the resolution is to add those two includes in finddialog.cpp

And as for the one related to the case sensitivity in findClicked() function see if you didn't modified something there, because the code there (the code from your first post) seems correct.

hot_tea
16th June 2013, 15:18
yes it works now, i've included the QHBoxLayout and QVBoxLayout in the finddialog.cpp then i guess i have typos in case sensivity area anyway i got it all work now with your help and thank you again,

by the way before i continue my reading in qt book, do you have any more tips or suggestion so i cant ask again cuz i might bother someone again which is not good for the busy people around working for the better tomorrow...I mean as long as i add this QT += widgets in the .pro file, ill be running both qt 4 and 5, then also i'll goind to read the link you gave to me then nothing more.....:D



case Solved;);)

Zlatomir
16th June 2013, 17:00
...by the way before i continue my reading in qt book, do you have any more tips or suggestion so i cant ask again cuz i might bother someone again which is not good for the busy people around working for the better tomorrow...
You are not bothering us, my suggestion was only to tell us information about the error you get, because we can't guess and usually as long as we just read some pieces of code we might overlook some common simple to fix errors that we can answer very quickly if you tell the error in the first post.
And as a suggestion i have only an advice to you: learn a little more C++, i don't want to be rude but it seems C++ is quite a new language for you and if you learn C++ in the same time with Qt it might seem overwhelming - and it might take all the fun out of Qt ;) as a book suggestion i say you search for "Thinking in C++" and you will find two volumes that are free to download.

...I mean as long as i add this QT += widgets in the .pro file, ill be running both qt 4 and 5, then also i'll goind to read the link you gave to me then nothing more.....:D Well, not really... that will give an error on Qt4, because Qt4 doesn't have the widgets module, but you can use this line: greaterThan(QT_MAJOR_VERSION, 4): QT += widgets in the .pro file, and that will add the widgets module only if Qt major version is higher than 4 so it won't add it for Qt4, it will add it only for Qt5.

There are other things that changed with version 5, some are in the link that i gave you in my first post and also there are some things where the recommended usage has changed, an example is QThread, in the book you might find a class that is derived from a QThread and run method is overridden, while the recommended usage is presented in the documentation, see here (http://qt-project.org/doc/qt-4.8/qthread.html#details) - another recommendation is to use the book to get to know Qt and the basic concepts like: widgets and layouts, parent-child,signals and slots, implicit sharing, but don't forget to use the documentation too, especially because the book about Qt are a little old (don't get me wrong, those are still good but they need a little bit of documentation studying to get the new functionality or the new recommended way to use a functionality)