Seite 1 von 1

Probleme mit Qt5

Verfasst: 18. Dezember 2013 15:48
von theuserbl
Jetzt, im Weihnachtsurlaub lohnt es sich ja, sich mal mit Qt zu beschäftigen.

Dummerweise macht mir Qt5 etwas Probleme.

Bei Qt4 konnte man mit einem einfachen

Code: Alles auswählen

qmake -project
qmake
make
ein Programm kompilieren.

Qt5 erstellt schon bei "qmake -project" eine nur unzureichende Projekt-Datei. Dort muß ich erst händisch als letzte Zeile

Code: Alles auswählen

QT += widgets uitools
einfügen.

Hinzu kommt, daß es bisher noch wenig Tutorials für Qt5 gibt.
Und die Qt4 Beispielprogramme, die ich gerade erstelle, bekomme ich nicht auf Qt5 portiert. :(

Hier ein Beispiel:

Code: Alles auswählen

#include <QtGui>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);
  QWidget window;
  window.setWindowTitle("Signal/Slot example");
  QVBoxLayout *vlayout = new QVBoxLayout(&window);
  
  QPushButton *button1 = new QPushButton(" show() ");
  QStackedLayout *layout1 = new QStackedLayout(vlayout);
  layout1->addWidget(button1);
  QObject::connect(button1, SIGNAL(clicked()), &window, SLOT(show()));

  QPushButton *button2 = new QPushButton(" hide() ");
  QStackedLayout *layout2 = new QStackedLayout(vlayout);
  layout2->addWidget(button2);
  QObject::connect(button2, SIGNAL(clicked()), &window, SLOT(hide()));

  QPushButton *button3 = new QPushButton(" showMinimized() ");
  QStackedLayout *layout3 = new QStackedLayout(vlayout);
  layout3->addWidget(button3);
  QObject::connect(button3, SIGNAL(clicked()), &window, SLOT(showMinimized()));

  QPushButton *button4 = new QPushButton(" showMaximized() ");
  QStackedLayout *layout4 = new QStackedLayout(vlayout);
  layout4->addWidget(button4);
  QObject::connect(button4, SIGNAL(clicked()), &window, SLOT(showMaximized()));
  
  QPushButton *button5 = new QPushButton(" showFullScreen() ");
  QStackedLayout *layout5 = new QStackedLayout(vlayout);
  layout5->addWidget(button5);
  QObject::connect(button5, SIGNAL(clicked()), &window, SLOT(showFullScreen()));
  
  QPushButton *button6 = new QPushButton(" showNormal() ");
  QStackedLayout *layout6 = new QStackedLayout(vlayout);
  layout6->addWidget(button6);
  QObject::connect(button6, SIGNAL(clicked()), &window, SLOT(showNormal()));

  QPushButton *button7 = new QPushButton(" close() ");
  QStackedLayout *layout7 = new QStackedLayout(vlayout);
  layout7->addWidget(button7);
  QObject::connect(button7, SIGNAL(clicked()), &window, SLOT(close()));

  QPushButton *button8 = new QPushButton(" raise() ");
  QStackedLayout *layout8 = new QStackedLayout(vlayout);
  layout8->addWidget(button8);
  QObject::connect(button8, SIGNAL(clicked()), &window, SLOT(raise()));
  
  QPushButton *button9 = new QPushButton(" lower() ");
  QStackedLayout *layout9 = new QStackedLayout(vlayout);
  layout9->addWidget(button9);
  QObject::connect(button9, SIGNAL(clicked()), &window, SLOT(lower()));

  QPushButton *button10 = new QPushButton(" setFocus() ");
  QStackedLayout *layout10 = new QStackedLayout(vlayout);
  layout10->addWidget(button10);
  QObject::connect(button10, SIGNAL(clicked()), &window, SLOT(setFocus()));

  window.show();
  return app.exec();
}
Naja, das neue Standard-LookAndFeel (bei Qt heißt es ja "Style") sieht mal wieder gut aus. Nach Plastique kommt Fusion.

Grüße
theuserbl

Re: Probleme mit Qt5

Verfasst: 19. Dezember 2013 13:28
von hilefoks
Moin,

eigentlich ist die Portierung von Qt4 nach Qt5 recht einfach. Allerdings haben sich natürlich einige Dinge geändert, so z.B. die include-Anweisungen in QWidget basierten Anwendungen.

Zu deinem Fall: Zunächst muss man bei bestehenden Qt4 Anwendungen die Projektdatei um einige Qt-Komponenten erweitern. Im einfachsten Fall ist das bei QWidget basierten Anwendungen folgende Zeile:

Code: Alles auswählen

QT += widgets
Eine Liste der Module von Qt 5.1 findet sich hier: http://qt-project.org/doc/qt-5.1/qtdoc/qtmodules.html

Dann müssen einige include Directiven angepasst werden. Insbesondere alle QWidgets includes. Waren diese in Qt4 noch im QtGui Modul beheimatet, finden sie sich nun im QWidgets Modul wieder. Ein include wie QtGui/QPushButton muss nun also zu QtWidgets/QPushButton werden. Dort liegt auch das Problem in deinem Beispiel. Es gibt auch einige Tools die einem die Arbeit etwas abnehmen können

Eine Anleitung die auch andere wichtige Aspekte beim Portieren behandelt findet sich hier: http://www.kdab.com/porting-from-qt-4-to-qt-5/

MfG,
Hilefoks

Re: Probleme mit Qt5

Verfasst: 20. Dezember 2013 10:00
von Hulk2442
Gibt es einen triftigen Grund das du über die Console compilieren musst?
Meiner Ansicht nach macht der QtEditor einer hervorragende Arbeit - sowohl unter Linux als auch Windows als auch OSX.

Re: Probleme mit Qt5

Verfasst: 20. Dezember 2013 14:32
von theuserbl
Danke euch beiden.

Es funktioniert nun.
main.cpp braucht tatsächlich noch ein #include <QtWidgets>.
Verstehe aber noch immer nicht, warum das qmake -project eine Datei erzeugt, in die man erst noch händisch QT += widgets einfügen muß.

Und an Hulk: Der QtCreator erzeugt wirklich gute Projektdateien, bei denen man nichts ändern braucht. Auch so ist QtCreator sehr hilfreich. Aber für den Anfang ist es gewöhnlich besser, wenn man erst einmal nicht so viel von einer IDE machen lässt.

Grüße
theuserbl

Re: Probleme mit Qt5

Verfasst: 22. Dezember 2013 15:51
von Scary Hallo
Ich füge in die *.pro-Datei folgende Zeile ein.

Code: Alles auswählen

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
Damit erschlägst du die meisten Fälle in Qt4 und Qt5

Re: Probleme mit Qt5

Verfasst: 10. Januar 2014 13:20
von Hulk2442
@theuserbl
Gerade für den Anfang ist die IDE sehr Hilfreich.
Denn damit kannst du dich auf das eigentliche Ziel - die Programmierung - konzentrieren.