Probleme mit Qt5

Alles rund um die Programmierung mit Qt
Antworten
theuserbl
Beiträge: 2
Registriert: 18. Dezember 2013 15:10

Probleme mit Qt5

Beitrag 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
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: Probleme mit Qt5

Beitrag 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
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

Re: Probleme mit Qt5

Beitrag 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.
theuserbl
Beiträge: 2
Registriert: 18. Dezember 2013 15:10

Re: Probleme mit Qt5

Beitrag 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
Scary Hallo

Re: Probleme mit Qt5

Beitrag 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
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

Re: Probleme mit Qt5

Beitrag 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.
Antworten