Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Displaying translucent / irregular-shaped windows with Qt

Is it possible to display translucent and/or irregular-shaped windows with Qt?

(I'm assuming it ultimately depends on the capabilities of the underlying GUI system, but let's assume at least Windows XP / Mac OS X)

If so, how does one accomplish this?

like image 475
Tony the Pony Avatar asked Aug 26 '09 10:08

Tony the Pony


2 Answers

Yes, it is possible. The key is the Qt::WA_TranslucentBackground attribute of QWidget

Here is a simple class that draws a round translucent window with a red background 50% alpha.

TranslucentRoundWindow.h:

#include <QWidget>

class TranslucentRoundWindow : public QWidget
{
    public:
        TranslucentRoundWindow(QWidget *parent = 0);
        virtual QSize sizeHint() const;

    protected:
        virtual void paintEvent(QPaintEvent *paintEvent);
};

TranslucentRoundWindow.cpp:

#include <QtGui>

#include "TranslucentRoundWindow.h"

TranslucentRoundWindow::TranslucentRoundWindow(QWidget *parent) : QWidget(parent, Qt::FramelessWindowHint)
{
    setAttribute(Qt::WA_TranslucentBackground);
}

QSize TranslucentRoundWindow::sizeHint() const
{
    return QSize(300, 300);
}

void TranslucentRoundWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255, 0, 0, 127));

    painter.drawEllipse(0, 0, width(), height());
}

If you want to be able to move this window with the mouse, you will have to override mousePressEvent, mouseMoveEvent and mouseReleaseEvent.

like image 160
0xced Avatar answered Oct 21 '22 04:10

0xced


It certainly is possible. Qt ships with the "Shaped Clock" demonstration. The documentation of which is here.

It creates a top-level window with an odd shape. Should be all you need.

like image 37
Thomi Avatar answered Oct 21 '22 04:10

Thomi