Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [Solved] QSplashScreen using a PNG with transparent areas
Forum Updated to NodeBB v4.3 + New Features

[Solved] QSplashScreen using a PNG with transparent areas

Scheduled Pinned Locked Moved General and Desktop
27 Posts 7 Posters 30.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    mohsen
    wrote on last edited by
    #12

    if the form transparency is the problem, there wont be difference in using objects.

    [quote author="peppe" date="1294920580"]Use a QLabel instead.

    http://bugreports.qt.nokia.com/browse/QTBUG-12820[/quote]

    1 Reply Last reply
    0
    • D Offline
      D Offline
      d.oberkofler
      wrote on last edited by
      #13

      [quote author="peppe" date="1294920580"]Use a QLabel instead.
      http://bugreports.qt.nokia.com/browse/QTBUG-12820[/quote]

      Thank you for the hint! I really seem to have hit bug 12820.

      The following code seems to work as expected:
      @
      QPixmap aPixmap(":/splash.png");
      QLabel* aWidget = new QLabel(0, Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
      aWidget->setAttribute(Qt::WA_TranslucentBackground);
      aWidget->setPixmap(aPixmap);
      aWidget->show();
      @

      I'm actually surprised to hit a bug in a rather prominent class like QSplashScreen. As there is no information on when this bug will be fixed it might make sense to vote for it.

      Does someone eventually have a workaround to get this working in a QSplashScreen?

      1 Reply Last reply
      0
      • U Offline
        U Offline
        ucomesdag
        wrote on last edited by
        #14

        I got it working by subclassing QSplashScreen, setting QSplashScreen::setPixmap(QPixmap splash); and setting the mask to the subclass, setMask(QPixmap mask); .

        Splash image with a text display:

        !http://img.mobypicture.com/aa470873918e7804b36e6fb037e5b0b0_view.jpg(screencap)!

        main:
        @QPixmap splashImage(":images/splash.png");
        QPixmap splashMask(":images/splashmask.png");

        customSplashScreen *splash = new customSplashScreen(splashImage);
        splash->setMessageRect(QRect::QRect(7, 253, 415, 14), Qt::AlignCenter); // Setting the message position.

        QFont splashFont;
        splashFont.setFamily("Arial");
        splashFont.setBold(true);
        splashFont.setPixelSize(9);
        splashFont.setStretch(125);

        splash->setFont(splashFont);
        splash->setMask(splashMask);
        splash->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::SplashScreen);
        splash->show();

        /* To intercept mousclick to hide splash screen. Since the
        splash screen is typically displayed before the event loop
        has started running, it is necessary to periodically call. */
        app.processEvents();

        splash->showStatusMessage(QObject::tr("Initializing..."));@

        customSplashScreen.h:
        @#ifndef CUSTOMSPLASHSCREEN_H
        #define CUSTOMSPLASHSCREEN_H

        #include <QSplashScreen>
        #include <QPainter>

        class customSplashScreen
        :public QSplashScreen
        {

        public:
        customSplashScreen(const QPixmap& pixmap);
        ~customSplashScreen();
        virtual void drawContents(QPainter *painter);
        void showStatusMessage(const QString &message, const QColor &color = Qt::black);
        void setMessageRect(QRect rect, int alignment = Qt::AlignLeft);

        private:
        QString message;
        int alignement;
        QColor color;
        QRect rect;
        };

        #endif // CUSTOMSPLASHSCREEN_H@

        customSplashScreen.cpp:
        @#include "customSplashScreen.h"

        customSplashScreen::customSplashScreen(const QPixmap& pixmap)
        {
        QSplashScreen::setPixmap(pixmap);
        };

        customSplashScreen::~customSplashScreen()
        {
        };

        void customSplashScreen::drawContents(QPainter *painter)
        {
        QPixmap textPix = QSplashScreen::pixmap();
        painter->setPen(this->color);
        painter->drawText(this->rect, this->alignement, this->message);
        };

        void customSplashScreen::showStatusMessage(const QString &message, const QColor &color)
        {
        this->message = message;
        this->color = color;
        this->showMessage(this->message, this->alignement, this->color);
        };

        void customSplashScreen::setMessageRect(QRect rect, int alignement)
        {
        this->rect = rect;
        this->alignement = alignement;
        };@

        Write “Qt”, not “QT” (QuickTime).

        1 Reply Last reply
        0
        • D Offline
          D Offline
          d.oberkofler
          wrote on last edited by
          #15

          [quote author="ucomesdag" date="1295004120"]I got it working by subclassing QSplashScreen, setting QSplashScreen::setPixmap(QPixmap splash); and setting the mask to the subclass, setMask(QPixmap mask); .

          Splash image with a text display:

          !http://img.mobypicture.com/aa470873918e7804b36e6fb037e5b0b0_view.jpg!
          [/quote]

          Thank you very much!
          Your approach look very promising.
          How exactly did you setup (alpha channel) the two images you are using?

          1 Reply Last reply
          0
          • U Offline
            U Offline
            ucomesdag
            wrote on last edited by
            #16

            The splash image:
            !http://img.mobypicture.com/4ffeff271423757e1833f553a292bd1c_view.jpg(splash)!

            and the mask:
            !http://img.mobypicture.com/158962e6c51d76d0bfe042338fb27d6e_view.jpg(mask)!

            Write “Qt”, not “QT” (QuickTime).

            1 Reply Last reply
            0
            • G Offline
              G Offline
              goetz
              wrote on last edited by
              #17

              Do you mind creating a wiki article in the "HowTo":http://developer.qt.nokia.com/wiki/Category:HowTo and/or "Code snippets":http://developer.qt.nokia.com/wiki/Category:snippets category? It would fit very well there!

              http://www.catb.org/~esr/faqs/smart-questions.html

              1 Reply Last reply
              0
              • U Offline
                U Offline
                ucomesdag
                wrote on last edited by
                #18

                [quote author="Volker" date="1295008017"]Do you mind creating a wiki article in the "HowTo":http://developer.qt.nokia.com/wiki/Category:HowTo and/or "Code snippets":http://developer.qt.nokia.com/wiki/Category:snippets category? It would fit very well there![/quote]

                Will do so!

                Write “Qt”, not “QT” (QuickTime).

                1 Reply Last reply
                0
                • U Offline
                  U Offline
                  ucomesdag
                  wrote on last edited by
                  #19

                  Wiki: "splashscreen snippet":http://developer.qt.nokia.com/wiki/Custom_splashscreen_with_text

                  Write “Qt”, not “QT” (QuickTime).

                  1 Reply Last reply
                  0
                  • D Offline
                    D Offline
                    d.oberkofler
                    wrote on last edited by
                    #20
                    • I have an image with an Alpha channel: am I correct in the assumption that the image (splash.png) you've used has no alpha channel and the mask (splashmask.png) is the (1 bit) alpha channel?

                    • If the above assumptions are correct I still seem to have problems with the semi-transparent parts of my image. In my case there is a shadow that uses a multibit alpha channel that is not shown correctly.

                    • For now I'm only able to show my splash screen properly using the following code:
                      @QPixmap aPixmap(":/splash.png");
                      QLabel* aWidget = new QLabel(0, Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
                      aWidget->setAttribute(Qt::WA_TranslucentBackground);
                      aWidget->setPixmap(aPixmap);
                      aWidget->show();
                      @

                    • Is there maybe a way to have QSplashScreen show the images in the same way as QLabel does when using the Qt::WA_TranslucentBackground attribute ?

                    • Is there maybe a way to to use QLabel as an alternative to QSplashScreen and add something similar to showMessage to the QLabel ?

                    1 Reply Last reply
                    0
                    • D Offline
                      D Offline
                      dangelog
                      wrote on last edited by
                      #21

                      [quote author="Dieter" date="1295332434"]

                      • Is there maybe a way to have QSplashScreen show the images in the same way as QLabel does when using the Qt::WA_TranslucentBackground attribute ?[/quote]

                      What do you mean? Did you read the BR I posted a link to?

                      [quote]

                      • Is there maybe a way to to use QLabel as an alternative to QSplashScreen and add something similar to showMessage to the QLabel ?
                        [/quote]

                      Use an ordinary QWidget with a QVBoxLayout holding two QLabels?

                      Software Engineer
                      KDAB (UK) Ltd., a KDAB Group company

                      1 Reply Last reply
                      0
                      • D Offline
                        D Offline
                        d.oberkofler
                        wrote on last edited by
                        #22

                        [quote author="peppe" date="1295366429"]What do you mean? Did you read the BR I posted a link to?[/quote]
                        Absolutely! I'm just trying to find a solution to my specific problem.

                        [quote author="peppe" date="1295366429"]Use an ordinary QWidget with a QVBoxLayout holding two QLabels?[/quote]
                        I had some problems with the Qt::WA_TranslucentBackground attribute in QWidget but QFrame seems to work as expected and I will very soon post a solution that worked for me.

                        1 Reply Last reply
                        0
                        • D Offline
                          D Offline
                          d.oberkofler
                          wrote on last edited by
                          #23

                          It took me a while but I have finally found a very simple and perfect solution for my problem with semitransparent images using an alpha channel with more then 1 bit.

                          It all comes down to use a QFrame with the Qt::WA_TranslucentBackground attribute and emulate the functionality of QSplashScreen.

                          I have tried to mimic as much as possible the functionality and apperance of the original QSplashScreen class but left out some methods to keep this example simple.

                          • This is the new CSplashScreen class that must be used instead of QSplashScreen:

                          @
                          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;
                          };
                          @

                          • The methods in CSplashScreen:

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

                          A simple function to the CSplashSCreen:

                          @
                          void
                          test_SplashScreen()
                          {
                          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;
                          }
                          @

                          • Example:
                            !http://img228.imageshack.us/img228/4619/csplashscreen.png!
                          1 Reply Last reply
                          0
                          • D Offline
                            D Offline
                            d.oberkofler
                            wrote on last edited by
                            #24

                            Before marking this topic as solved, I have now also added a complete example "CSplashScreen":http://developer.qt.nokia.com/wiki/QSplashScreen_replacement_for_semitransparent_images" to the "Code snippets":http://developer.qt.nokia.com/wiki/Category:snippets WiKi.

                            Thank you all for all your help!

                            1 Reply Last reply
                            0
                            • G Offline
                              G Offline
                              giesbert
                              wrote on last edited by
                              #25

                              Hi Dieter,

                              just one note, I would make the QPainter instance an object on the stack.
                              And second: are you sure you want to call the default implementation for the paint event? you do all painting yourselve, don't you?

                              Nokia Certified Qt Specialist.
                              Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                              1 Reply Last reply
                              0
                              • D Offline
                                D Offline
                                d.oberkofler
                                wrote on last edited by
                                #26

                                [quote author="Gerolf" date="1295535937"]Hi Dieter,
                                just one note, I would make the QPainter instance an object on the stack.
                                And second: are you sure you want to call the default implementation for the paint event? you do all painting yourselve, don't you?[/quote]

                                I agree (and have already changed the code snippets)

                                1 Reply Last reply
                                0
                                • E Offline
                                  E Offline
                                  edoardo
                                  wrote on last edited by
                                  #27

                                  Updated link to "CSplashScreen":http://qt-project.org/wiki/QSplashScreen-Replacement-for-Semitransparent-Images code snippets

                                  --
                                  "You were not made to live your lives as brutes, | but to be followers of virtue"

                                  1 Reply Last reply
                                  0

                                  • Login

                                  • Login or register to search.
                                  • First post
                                    Last post
                                  0
                                  • Categories
                                  • Recent
                                  • Tags
                                  • Popular
                                  • Users
                                  • Groups
                                  • Search
                                  • Get Qt Extensions
                                  • Unsolved