J.A.Norton
J.A.Norton

Reputation: 115

How can I program a custom popup Window in Qt?

My Qt application consists of several screens added on a QStackedLayout(). Now after some useraction I would like a little popup window that confirms the action and disappears after a few seconds. What I would like is a gray rectangle with black border and some text in it. No buttons, no titlebar.

I tried to do it with QMessage Box (see code below) but in general it doesnt seem to be possible to adjust border styles for QMessageBox(). Also the size can't be adjusted.

QMessageBox* tempbox = new QMessageBox;
tempbox->setWindowFlags(Qt::FramelessWindowHint);  //removes titlebar
tempbox->setStandardButtons(0); //removes button
tempbox->setText("Some text");
tempbox->setFixedSize(800,300); //has no effect
tempbox->show();
QTimer::singleShot(2000, tempbox, SLOT(close()));  //closes box after 2 seconds

So, how can I program a custom popup Window in Qt?

Upvotes: 2

Views: 7961

Answers (1)

Scheff's Cat
Scheff's Cat

Reputation: 20151

First of all, I'd like to recommend the Windows Flags Example of the Qt docs. It provides a nice sample to play around with this topic. In this sample, a QWidget is derived to show the effect of the distinct flags. This brought me to the idea that probably any QWidget can be used for this if the appropriate Qt::WindowFlags are set. I choosed QLabel because

  • it can display text
  • it inherits from QFrame and, thus, can have a frame.

Source code testQPopup.cc:

// standard C++ header:
#include <iostream>
#include <string>

// Qt header:
#include <QApplication>
#include <QLabel>
#include <QMainWindow>
#include <QTimer>

using namespace std;

int main(int argc, char **argv)
{
  cout << QT_VERSION_STR << endl;
  // main application
#undef qApp // undef macro qApp out of the way
  QApplication qApp(argc, argv);
  // setup GUI
  QMainWindow qWin;
  qWin.setFixedSize(640, 400);
  qWin.show();
  // setup popup
  QLabel qPopup(QString::fromLatin1("Some text"),
    &qWin,
    Qt::SplashScreen | Qt::WindowStaysOnTopHint);
  QPalette qPalette = qPopup.palette();
  qPalette.setBrush(QPalette::Background, QColor(0xff, 0xe0, 0xc0));
  qPopup.setPalette(qPalette);
  qPopup.setFrameStyle(QLabel::Raised | QLabel::Panel);
  qPopup.setAlignment(Qt::AlignCenter);
  qPopup.setFixedSize(320, 200);
  qPopup.show();
  // setup timer
  QTimer::singleShot(1000,
    [&qPopup]() {
    qPopup.setText(QString::fromLatin1("Closing in 3 s"));
  });
  QTimer::singleShot(2000,
    [&qPopup]() {
    qPopup.setText(QString::fromLatin1("Closing in 2 s"));
  });
  QTimer::singleShot(3000,
    [&qPopup]() {
    qPopup.setText(QString::fromLatin1("Closing in 1 s"));
  });
  QTimer::singleShot(4000, &qPopup, &QLabel::hide);
  // run application
  return qApp.exec();
}

I compiled with VS2013 and Qt 5.6 on Windows 10 (64 bit). The image below shows a snaphot:

Snapshot of testQPopup.exe

To make the popup better visible (and because I liked it), I changed the background color of the QLabel for popup. And, I couldn't resist to add a little countdown.

Upvotes: 6

Related Questions