28

I'm quite new to qt and c++ and I've encountered a problem that I can't seem to figure out. I'm wanting to open a frameless and transparent window when I click a button on the main ui. I've got the code working to open a new window when I press a button on the main ui but I can't seem to get the frameless and transparent part working.

Here is the source codes for the small program that I wrote to learn this

main.cpp

#include "learnwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    LearnWindow w;
    w.show();

    return a.exec();
}

Here is the LearnWindow.h

#ifndef LEARNWINDOW_H
#define LEARNWINDOW_H

#include <QMainWindow>
#include <transwindow.h>

namespace Ui {
class LearnWindow;
}

class LearnWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit LearnWindow(QWidget *parent = 0);
    ~LearnWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::LearnWindow *ui;
    TransWindow *winTrans;

public slots:
    void openTrans();
};

#endif // LEARNWINDOW_H

Here is learnwindow.cpp

#include "learnwindow.h"
#include "ui_learnwindow.h"

LearnWindow::LearnWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::LearnWindow)
{
    ui->setupUi(this);
}

LearnWindow::~LearnWindow()
{
    delete ui;
}

void LearnWindow::openTrans()
{
    winTrans = new TransWindow (this);
    //winTrans->setWindowTitle("NewWin");
   // winTrans->setWindowFlags(Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint);
    //winTrans->setAttribute(Qt::WA_TranslucentBackground,true);
    //winTrans->setAutoFillBackground(false);
    //winTrans->setStyleSheet("background:transparent;");
    winTrans->show();
}

void LearnWindow::on_pushButton_clicked()
{
    openTrans();
}

Here is the transwindow.h

#ifndef TRANSWINDOW_H
#define TRANSWINDOW_H

#include <QDialog>

namespace Ui {
class TransWindow;
}

class TransWindow : public QDialog
{
    Q_OBJECT

public:
    explicit TransWindow(QWidget *parent = 0);

    //setWindowFlags(windowFlags()| Qt::FramelessWindowHint);

    ~TransWindow();

private:
    Ui::TransWindow *ui;
};

#endif // TRANSWINDOW_H

And here is transwindow.cpp

#include "transwindow.h"
#include "ui_transwindow.h"

TransWindow::TransWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TransWindow)
{
    //setWindowTitle("NewWin");
    //setWindowFlags(Qt::FramelessWindowHint);
    //setAttribute(Qt::WA_TranslucentBackground,true);
    ui->setupUi(this);
}

TransWindow::~TransWindow()
{
    delete ui;
}

In the different source codes you'll see commented out lines which is the different things that I've tried. For the most part the problem is, if I un-comment out any of the lines that try to set the "Qt::FramlessWindowHint" the program runs normally but never opens a new window when I click the button on the main ui.

If I un-comment out any of the lines where I set the "Qt::WA_TranslucentBackground" the new window will open up when when the button is pressed in the main ui but the background of the new window is black, not transparent.

Other info that may be pertinent: linux: ubunto 12.04 qt 5.0.2 (64-bit) qt creator 2.7.1

Noam M
  • 3,156
  • 5
  • 26
  • 41
Caveman
  • 423
  • 1
  • 4
  • 9
  • No problem, glad I could help! With questions of that quality, you'll get the rep. to upvote in no time, don't worry about it :-) There's lots of stuff about how these sites work in the [help] section, or in the [FAQ](http://meta.stackexchange.com/questions/7931/faq-for-stack-exchange-sites) page on [meta] if you're looking for info. – Mat Aug 19 '13 at 17:20

1 Answers1

49

Try this:

setWindowFlags(Qt::Widget | Qt::FramelessWindowHint);
setParent(0); // Create TopLevel-Widget
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_TranslucentBackground, true);  
setAttribute(Qt::WA_PaintOnScreen); // not needed in Qt 5.2 and up
Kuba hasn't forgotten Monica
  • 95,931
  • 16
  • 151
  • 313
Leo Chapiro
  • 13,678
  • 8
  • 61
  • 92
  • 3
    That solved part of the problem. I put the code you listed, in transwindow.cpp and now the frameless window opens up, but it still has a black background. Hmm, i'll have to do some more reading and thinking on the last part. Thanks for solving the first half of the problem. – Caveman Aug 19 '13 at 15:28
  • 4
    For me it worked without the PaintOnScreen on Qt5, otherwise I get a copy of the underlying background instead of transparency – quimnuss Nov 16 '14 at 02:25
  • Is it possible to achieve this on Windows without using `WA_TranslucentBackground`? – SexyBeast Jan 03 '16 at 01:33
  • I'm adding a splash window on top of a native Windows window. Therefore I'm using Windows API `SetParent(childHwnd, parentHwnd)`. After doing this, the Widget window gets coordinates relative to the parent window, when using `mywidget->move(x, y)`. When I apply `WA_TranslucentBackground` in the next step, the relative coordinate calculation seems to go overboard, as I have to do `x = relative_x - parent_rect.x()` (same for y) to get my child window positioned correctly. Took a while to figure out! – thomasa88 Apr 10 '23 at 07:09