Question

I have this code, I want it to show a splash screen since it will be bigger, having had made a kind of timer so it is possible to see the splash screen working. The problem is I don't see the splash screen, but the code will be running while the splash screen doesn't appear, sending me directly to the main window without showing the splas screen. Here's my code.

main.cpp

#include <iostream>

#include <QApplication>
#include <quazip/quazip.h>

#include "splashwindow.h"
#include "mainwindow.h"
#include "database.h"

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

    /* Define the splash screen */
    SplashWindow splashW;
    /* Show the splash screen */
    splashW.show();

    /* Download the database */
    /* Define the database */
    Downloader db;
    /* Donwloading the database */
    db.doDownload();

    /* Unzip the database */
    /* Define the database */
    //Unzipper uz;
    //uz.Unzip();

    for(int i = 0; i < 1000000; i++)
    {
        cout << i << endl;
    }

    /* Close the splash screen */
    splashW.hide();
    splashW.close();

    /* Define the main screen */
    MainWindow mainW;
    /* Show the main window */
    mainW.showMaximized();

    return app.exec();
}

splashwindow.cpp

#include <iostream>
#include <QStyle>
#include <QDesktopWidget>

#include "splashwindow.h"
#include "ui_splashwindow.h"
#include "database.h"

/* Splash screen constructor */
SplashWindow::SplashWindow (QWidget *parent) :
    QMainWindow(parent), ui(new Ui::SplashWindow)
{
    ui->setupUi(this);
    /* Set window's flags as needed for a splash screen */
    this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | Qt::SplashScreen);
}

/* Splash screen destructor */
SplashWindow::~SplashWindow()
{
    delete ui;
}

splashwindow.h

#ifndef SPLASHWINDOW_H
#define SPLASHWINDOW_H

#include <QMainWindow>

namespace Ui {
class SplashWindow;
}

class SplashWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit SplashWindow(QWidget *parent = 0);
    ~SplashWindow();

private:
    Ui::SplashWindow *ui;
};

#endif // SPLASHWINDOW_H

The commands run in such way that the splash screen will not appear before they are run, not showing, wich I can't find a way to fix.

[EDIT] The part of the code corresponding to the closure was misplaced, though it still doesn't work after putting it correctly.

Was it helpful?

Solution

You have at least two issues ongoing:

  • You send the main thread into a blocking loop and it has no way to process events including the show of your window. That requires some event processing, hence you would need to call the following method before your while loop:

void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents) [static]

  • I would suggest to use QSplashScreen in the first as per documentation. Note the explicit call for processing the events in the example. The code below works fine for me.

main.cpp

#include <QApplication>
#include <QPixmap>
#include <QMainWindow>
#include <QSplashScreen>

#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPixmap pixmap("splash.png");
    QSplashScreen splash(pixmap);
    splash.show();
    app.processEvents();
    for (int i = 0; i < 500000; ++i)
        qDebug() << i;
    QMainWindow window;
    window.show();
    splash.finish(&window);
    return app.exec();
}

main.pro

TEMPLATE = app
TARGET = main
greaterThan(QT_MAJOR_VERSION, 4):QT += widgets
SOURCES += main.cpp

OTHER TIPS

What has worked for me, where the splash worked on earlier versions of Qt but not since 5.6 was to comment out the setWindowFlags statements.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top