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.2k 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.
  • D Offline
    D Offline
    d.oberkofler
    wrote on last edited by
    #8

    [quote author="Gerolf" date="1294907465"]That has a similar effect, but a mask does not make alpha, it makes transparent or not.

    A top level widget (QSplashScreen is a widget) can be transparent. Sorry, I didn't read the complete article before. Currently I can't test it, but you could play with the following things:

    • setWindowOpacity(xxx);
    • setAttribute(Qt::WA_NoBackground);
    • setAttribute(Qt::WA_NoSystemBackground);
      [/quote]

    Thank you for the additional information but unfortunately it seem not to solve my problem:

    setWindowOpacity(.75);
    Makes the complete widget 75% translucent but does not affect the area using the alpha channel.

    setAttribute(Qt::WA_NoBackground);
    setAttribute(Qt::WA_NoSystemBackground);
    setAttribute(Qt::WA_TranslucentBackground);
    All tree attributes just make the background of the window black and the area involved depends on the use of setMask.

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mohsen
      wrote on last edited by
      #9

      what OS you're using?

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

        Currently testing on OSX and Windows.

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

          Use a QLabel instead.

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

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

          1 Reply Last reply
          0
          • 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