Seite 1 von 3

[gelöst]Qt SplashScreen problem

Verfasst: 27. April 2007 14:52
von Nash
Bin ein neuer user im Umgang mit Qt.
Ich will einfach mal einen SplashScreen anzeigen, funktioniert aber nicht,
er zeigt mir gar nix an. Nur meinen Hauptdialog.

Hier der Komplette Code meiner Main.cpp

Code: Alles auswählen

#include <Qt/QApplication.h>
#include <Qt/QSplashScreen.h>
#include <Qt/QMainwindow.h>

// QT includes
#ifdef Q_WS_WIN
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
int main(int argc, char **argv);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                                 LPSTR lpCmdLine, int nCmdShow)
{
  return main(__argc, __argv);
}
#endif

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

	QPixmap pixmap(":/images/splash.png");
	QSplashScreen* splashScreen = new QSplashScreen(pixmap,Qt::WindowStaysOnTopHint );
	
	splashScreen->show();
	splashScreen->showMessage("Initialising Engine", Qt::AlignCenter |Qt::AlignBottom | Qt::AlignAbsolute, Qt::black);
	app.processEvents();
	for(double i=0;i<10000000;i++)
	{
	}
	
     QMainWindow window;
     window.show();
	 splashScreen->finish(&window);
   

	

    return app.exec();
}

Verfasst: 27. April 2007 15:26
von Christian81
Erstens

Das

Code: Alles auswählen

// QT includes
#ifdef Q_WS_WIN
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
int main(int argc, char **argv);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                 LPSTR lpCmdLine, int nCmdShow)
{
  return main(__argc, __argv);
}
#endif
Ist völlig überflüssig und sogar kontraprdouktiv

Und zweites - wenn deine App icht in den Eventloop (app.exec()) kommt, kann auch kein Splashscreen angezeigt werden.

Verfasst: 27. April 2007 15:28
von Nash
ich möchte aber nicht die Konsole immer sehen.
hast du eine bessere Lösung?

warum soll er nicht in meinen event loop kommen?

Verfasst: 27. April 2007 15:34
von Christian81
Nash hat geschrieben:ich möchte aber nicht die Konsole immer sehen.
hast du eine bessere Lösung?
Siehe Doku -> http://doc.trolltech.com/4.2/qmake-vari ... tml#config 'windows' und 'console'
warum soll er nicht in meinen event loop kommen?
Wie denn? Die Eventloop wird erst bei app.exec() gestartet, also kann auch nichts angezeigt werden.

Verfasst: 27. April 2007 15:48
von Nash
keine Ahnung was du meinst.

Code: Alles auswählen

 MainWindow window;
	
	splashScreen->finish(&window);
    window.show();
    return app.exec();
bei mir läuft er in den eventloop rein

wo soll ich das app.exec() denn nun aufrufen?

hier der code von der qt seite, sehe da keinen unterschied

Code: Alles auswählen

int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     QPixmap pixmap(":/splash.png");
     QSplashScreen splash(pixmap);
     splash.show();
     app.processEvents();
     ...
     QMainWindow window;
     window.show();
     splash.finish(&window);
     return app.exec();
 }

Verfasst: 27. April 2007 15:53
von Christian81
Nash hat geschrieben:keine Ahnung was du meinst.

Code: Alles auswählen

 MainWindow window;
	
	splashScreen->finish(&window);
    window.show();
    return app.exec();
bei mir läuft er in den eventloop rein
Ja, aber da window dann schon angezeigt wird bleibt keine Zeit für den Splashscreen. Die Ventloop started nunmal erst innerhalb app.exec()! Siehe auch Doku

Verfasst: 27. April 2007 16:00
von Nash
also ich probiere mal zu erklären, mein splashscreen ist einfach zu schnell, er wird angezeigt und gleich wieder geschlossen, kann es das sein?

Verfasst: 27. April 2007 16:17
von Christian81
Er wird gar nicht angezeigt weil er nicht angezeigt wird (da finish(&window)) den Splashscreen beendet wenn window angezeigt wird, was ja der Fall ist wenn dein Programm das erste mal Events abarbeiten kann.

Hast du Dir überhaupt mal den Link durchgelesen?

Verfasst: 27. April 2007 16:20
von Nash
ja, und warum fügen die dann diesen code dort ein?
der ist ja dann falsch

Verfasst: 27. April 2007 16:27
von Christian81
Nash hat geschrieben:ja, und warum fügen die dann diesen code dort ein?
der ist ja dann falsch
Was ist da falsch? Ich würde mir erstmal die Grundlagen der Eventloop durchlesen.

Verfasst: 27. April 2007 16:35
von Nash
erkläre mir doch bitte an meinem Beispiel wie ich meinen SplashScreen anzeigen kann. Daraus kann ich dann lernen.

Verfasst: 27. April 2007 17:42
von Nash
er hat den Pfad zum Bild nicht gefunden, das gute pixmap liefert mir leider keinen Null zeiger zurück, wenn er kein Bild findet.

Nix hier mit eventloop...der code war korrekt

Verfasst: 27. April 2007 19:00
von Christian81
Nash hat geschrieben:edas gute pixmap liefert mir leider keinen Null zeiger zurück, wenn er kein Bild findet.
Ist ja auch kein Pointer sondern ein Objekt

Verfasst: 30. April 2007 09:57
von Nash
jetzt weiß ich wie ich über VS qrc files generieren kann.

so findet er dann auch die Bilder.

anbei du hattest gesagt das das hier keine gute Lösung sei für QT ohne Konsole öffnen:

Code: Alles auswählen

#ifdef Q_WS_WIN
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
int main(int argc, char **argv);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                 LPSTR lpCmdLine, int nCmdShow)
{
  return main(__argc, __argv);
}
#endif 
gibt es eine besser in Visual Studio?

Verfasst: 30. April 2007 10:07
von Christian81
Nash hat geschrieben: gibt es eine besser in Visual Studio?
Habe ich doch oben schon geschrieben...