Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.
QSplashScreen-Replacement-for-Semitransparent-Images: Difference between revisions
No edit summary |
(Cleanup) |
||
(5 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{LangSwitch}} | |||
__NOTOC__ | |||
[[Category:snippets]] | |||
The CSplashScreen class can be used as a replacement for the Qt class QSplashScreen if semitransparent images using an alpha channel with more than 1 bit needs to be used. | The CSplashScreen class can be used as a replacement for the Qt class QSplashScreen if semitransparent images using an alpha channel with more than 1 bit needs to be used. | ||
Line 7: | Line 9: | ||
In the implementation all comes down to use a QFrame with the Qt::WA_TranslucentBackground attribute and emulate the functionality of QSplashScreen. | In the implementation all comes down to use a QFrame with the Qt::WA_TranslucentBackground attribute and emulate the functionality of QSplashScreen. | ||
== CSplashScreen.pro == | |||
<code> | |||
HEADERS ''= CSplashScreen.h | |||
SOURCES''= CSplashScreen.cpp main.cpp | |||
OTHER_FILES ''= | |||
RESOURCES''= images.qrc | |||
</code> | |||
== CSplashScreen.h == | |||
<code> | |||
#ifndef CSPLASHSCREEN_''H | |||
#define CSPLASHSCREENH | |||
#include <QFrame> | |||
//////////////////////////////////////////////////////////////////////////// | |||
class CSplashScreen : public QFrame | |||
{ | |||
public: | |||
CSplashScreen(const QPixmap& pixmap); | |||
== | void clearMessage(); | ||
void showMessage(const QString& theMessage, int theAlignment = Qt::AlignLeft, const QColor& theColor = Qt::black); | |||
* [ | private: | ||
virtual void paintEvent(QPaintEvent* pe); | |||
QPixmap itsPixmap; | |||
QString itsMessage; | |||
int itsAlignment; | |||
QColor itsColor; | |||
}; | |||
#endif // CSPLASHSCREEN''_H | |||
</code> | |||
==== CSplashScreen.cpp ==== | |||
<code> | |||
#include <QPainter> | |||
#include "CSplashScreen.h" | |||
//////////////////////////////////////////////////////////////////////////// | |||
CSplashScreen::CSplashScreen(const QPixmap& thePixmap) | |||
: QFrame(0, Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint) | |||
, itsPixmap(thePixmap) | |||
{ | |||
setAttribute(Qt::WA_TranslucentBackground); | |||
setFixedSize(itsPixmap.size()); | |||
}; | |||
//////////////////////////////////////////////////////////////////////////// | |||
void CSplashScreen::clearMessage() | |||
{ | |||
itsMessage.clear(); | |||
repaint(); | |||
} | |||
//////////////////////////////////////////////////////////////////////////// | |||
void CSplashScreen::showMessage(const QString& theMessage, int theAlignment/* = Qt::AlignLeft*/, const QColor& theColor/* = Qt::black*/) | |||
{ | |||
itsMessage = theMessage; | |||
itsAlignment = theAlignment; | |||
itsColor = theColor; | |||
repaint(); | |||
} | |||
//////////////////////////////////////////////////////////////////////////// | |||
void CSplashScreen::paintEvent(QPaintEvent* pe) | |||
{ | |||
QRect aTextRect(rect()); | |||
aTextRect.setRect(aTextRect.x() + 5, aTextRect.y() + 5, aTextRect.width() - 10, aTextRect.height() - 10); | |||
QPainter aPainter(this); | |||
aPainter.drawPixmap(rect(), itsPixmap); | |||
aPainter.setPen(itsColor); | |||
aPainter.drawText(aTextRect, itsAlignment, itsMessage); | |||
} | |||
</code> | |||
== main.cpp == | |||
<code> | |||
#include <QApplication> | |||
#include <QThread> | |||
#include "CSplashSCreen.h" | |||
int main(int argc, char '''argv[]) | |||
{ | |||
QApplication anApplication(argc, argv); | |||
class SleeperThread : public QThread | |||
{ | |||
public: | |||
static void msleep(unsigned long msecs) {QThread::msleep(msecs);} | |||
}; | |||
QPixmap aSplashImage(":/splash.png"); | |||
CSplashScreen''' aSplashScreen = new CSplashScreen(aSplashImage); | |||
aSplashScreen->show(); | |||
for (int i = 1; i <= 5; i++) | |||
{ | |||
aSplashScreen->showMessage(QString("Processing %1…").arg(i), Qt::AlignTop | Qt::AlignLeft, Qt::white); | |||
SleeperThread::msleep(1000); | |||
} | |||
delete aSplashScreen; | |||
return 0; | |||
} | |||
</code> |
Latest revision as of 11:50, 26 May 2015
En Ar Bg De El Es Fa Fi Fr Hi Hu It Ja Kn Ko Ms Nl Pl Pt Ru Sq Th Tr Uk Zh
The CSplashScreen class can be used as a replacement for the Qt class QSplashScreen if semitransparent images using an alpha channel with more than 1 bit needs to be used.
The new class tries to mimic as much as possible the functionality and appearance of the original QSplashScreen class and only misses a few methods to keep this code snipped as simple as possible.
In the implementation all comes down to use a QFrame with the Qt::WA_TranslucentBackground attribute and emulate the functionality of QSplashScreen.
CSplashScreen.pro
HEADERS ''= CSplashScreen.h
SOURCES''= CSplashScreen.cpp main.cpp
OTHER_FILES ''=
RESOURCES''= images.qrc
CSplashScreen.h
#ifndef CSPLASHSCREEN_''H
#define CSPLASHSCREENH
#include <QFrame>
////////////////////////////////////////////////////////////////////////////
class CSplashScreen : public QFrame
{
public:
CSplashScreen(const QPixmap& pixmap);
void clearMessage();
void showMessage(const QString& theMessage, int theAlignment = Qt::AlignLeft, const QColor& theColor = Qt::black);
private:
virtual void paintEvent(QPaintEvent* pe);
QPixmap itsPixmap;
QString itsMessage;
int itsAlignment;
QColor itsColor;
};
#endif // CSPLASHSCREEN''_H
CSplashScreen.cpp
#include <QPainter>
#include "CSplashScreen.h"
////////////////////////////////////////////////////////////////////////////
CSplashScreen::CSplashScreen(const QPixmap& thePixmap)
: QFrame(0, Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint)
, itsPixmap(thePixmap)
{
setAttribute(Qt::WA_TranslucentBackground);
setFixedSize(itsPixmap.size());
};
////////////////////////////////////////////////////////////////////////////
void CSplashScreen::clearMessage()
{
itsMessage.clear();
repaint();
}
////////////////////////////////////////////////////////////////////////////
void CSplashScreen::showMessage(const QString& theMessage, int theAlignment/* = Qt::AlignLeft*/, const QColor& theColor/* = Qt::black*/)
{
itsMessage = theMessage;
itsAlignment = theAlignment;
itsColor = theColor;
repaint();
}
////////////////////////////////////////////////////////////////////////////
void CSplashScreen::paintEvent(QPaintEvent* pe)
{
QRect aTextRect(rect());
aTextRect.setRect(aTextRect.x() + 5, aTextRect.y() + 5, aTextRect.width() - 10, aTextRect.height() - 10);
QPainter aPainter(this);
aPainter.drawPixmap(rect(), itsPixmap);
aPainter.setPen(itsColor);
aPainter.drawText(aTextRect, itsAlignment, itsMessage);
}
main.cpp
#include <QApplication>
#include <QThread>
#include "CSplashSCreen.h"
int main(int argc, char '''argv[])
{
QApplication anApplication(argc, argv);
class SleeperThread : public QThread
{
public:
static void msleep(unsigned long msecs) {QThread::msleep(msecs);}
};
QPixmap aSplashImage(":/splash.png");
CSplashScreen''' aSplashScreen = new CSplashScreen(aSplashImage);
aSplashScreen->show();
for (int i = 1; i <= 5; i++)
{
aSplashScreen->showMessage(QString("Processing %1…").arg(i), Qt::AlignTop | Qt::AlignLeft, Qt::white);
SleeperThread::msleep(1000);
}
delete aSplashScreen;
return 0;
}