添加开机界面,based on Qt Widget
splashwidget.h
#include <QMainWindow>
#include <QPainter>
#include <QImage>
#include <QTimer>
#include <QUrl>
class SplashWidget : public QMainWindow
{
Q_OBJECT
public:
SplashWidget(QWidget *parent = 0) : QMainWindow(parent){
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
setAttribute(Qt::WA_TranslucentBackground);
}
void start(){
this->show();
timer = new QTimer;
connect(timer, SIGNAL(timeout()), this, SLOT(timeUp()));
timer->start(delayTimeMs);
}
void setSplashImgPath(const QString& path) {
splashImgPath = path;
image = QImage(path);
sizeH = image.height();
sizeW = image.width();
this->setFixedSize(sizeW, sizeH);
}
void setMainPath(const QString& path){ mainPath = QUrl(path); }
void setTime(const int& time){ delayTimeMs = time; }
protected:
virtual void paintEvent( QPaintEvent *){
QPainter p(this);
p.save();
p.drawImage(0, 0, image);
p.restore();
}
signals:
void closeSplashScreen(QUrl);
private slots:
void timeUp(){
this->hide();
timer->stop();
delete timer;
emit closeSplashScreen(mainPath);
}
private:
QTimer *timer;
QString splashImgPath;
QUrl mainPath;
int delayTimeMs;
QImage image;
int sizeH, sizeW;
};
main.cpp
int main(){
...
QQmlApplicationEngine engine;
SplashWidget screen;
screen.setTime(1800);
screen.setSplashImgPath(":/img/splash.png");
screen.setMainPath("qrc:/main.qml");
screen.start();
QObject::connect(&screen, SIGNAL(closeSplashScreen(QUrl)), &engine, SLOT(load(QUrl)));
...
SplashWidget 和 SplashScreen 的区别在于,前者使用QWidget实现的,后者使用QQuickView实现的。前者的优势在于,可以重载 paintEvent,对界面设计的自由度很大,后者达不到这个目的,比如实现背景透明。