4

私はこのコードを持っています。スプラッシュ スクリーンが動作していることを確認できるように、一種のタイマーを作成したので、スプラッシュ スクリーンが大きくなるため、スプラッシュ スクリーンを表示したいと考えています。問題は、スプラッシュ スクリーンが表示されないことですが、スプラッシュ スクリーンが表示されていない間にコードが実行され、スプラッシュ スクリーンを表示せずにメイン ウィンドウに直接送られます。これが私のコードです。

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();
}

スプラッシュウィンドウ.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;
}

スプラッシュウィンドウ.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

コマンドは、実行される前にスプラッシュ画面が表示されず、表示されないように実行されますが、修正する方法が見つかりません。

[編集] クロージャーに対応するコードの一部が間違って配置されていましたが、正しく配置しても機能しません。

4

2 に答える 2

4

少なくとも 2 つの問題が進行中です。

  • メイン スレッドをブロック ループに送り、ウィンドウの表示を含むイベントを処理する方法がありません。これにはイベント処理が必要なため、while ループの前に次のメソッドを呼び出す必要があります。

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

  • documentationに従って、最初に QSplashScreen を使用することをお勧めします。この例では、イベントを処理するための明示的な呼び出しに注意してください。以下のコードは私にとってはうまくいきます。

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
于 2014-01-05T02:50:14.643 に答える