Я помещаю QProgressBar
внутрь QSplashScreen
путем создания подкласса QSplashScreen. Он переопределяет метод drawContents()
.
Я думал, что правильно настроил геометрию, но она отображается как в верхней, так и в нижней части экрана. Я не знаю почему. Возможно, есть другой способ выровнять его. Цифры правильные, так как изображение имеет размер 380x284, поэтому индикатор выполнения высотой 19 должен быть на 265 пикселей ниже.
Извините за дерьмовое изображение, заставка не показывалась с кнопкой печати экрана. На данный момент это просто 1-цветная белая заставка, но, как вы можете видеть, полоса прогресса сверху и снизу (они оба одного цвета, это освещение от камеры).
Другой проблемой будет метод showMessage()
QSplashScreen. Я хочу, чтобы сообщение отображалось над индикатором выполнения, выровненным по правому краю... если у кого-нибудь есть идеи, как это сделать.
заставка.cpp
#include "splashscreen.h"
SplashScreen::SplashScreen(QApplication *app, QWidget *parent) :
QSplashScreen(parent)
{
this->app = app;
this->setPixmap(QPixmap(":/images/splashscreen.png"));
this->setCursor(Qt::BusyCursor);
// if I dont make it a child, it *only* renders at the top
progress = new QProgressBar(this);
progress->setGeometry(0, 265, 380, 19); // puts it at bottom
progress->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
progress->setValue(0);
progress->setMaximum(100);
progress->setEnabled(true);
this->showMessage("Hello", Qt::AlignBottom);
connect(progress, SIGNAL(valueChanged(int)), this, SLOT(progressBarUpdated(int)));
}
void SplashScreen::drawContents(QPainter *painter)
{
QSplashScreen::drawContents(painter);
this->progress->render(painter);
}
void SplashScreen::progressBarUpdated(int value)
{
this->repaint();
this->app->processEvents();
}
заставка.h
#ifndef SPLASHSCREEN_H
#define SPLASHSCREEN_H
#include <QSplashScreen>
#include <QProgressBar>
#include <QApplication>
class SplashScreen : public QSplashScreen
{
Q_OBJECT
public:
explicit SplashScreen(QApplication *app, QWidget *parent = 0);
QProgressBar *progress;
QWidget *spacer;
QApplication *app;
public slots:
void progressBarUpdated(int value);
protected:
void drawContents(QPainter *painter);
};
#endif // SPLASHSCREEN_H
main.cpp
#include <QtGui/QApplication>
#include <time.h>
#include "splashscreen.h"
#include "mainwindow.h"
int main(int argc, char *argv[])
{
srand(time(0));
QApplication a(argc, argv);
SplashScreen *splash = new SplashScreen(&a);
splash->show();
// snip.. loading a ton of stuff into memory at startup
// if you're testing this you might have to sleep/timer here iono
MainWindow w;
splash->finish(&w);
w.show();
return app.exec();
}
python
? 06.04.2021