Rendre QWidget transparent

j'ai un QWidget - widget de superposition basé qui devrait peindre du texte et avoir lieu sur le widget central de mon application. Le problème est que je ne peux pas définir le fond du widget de superposition pour être transparent. Ce que j'ai déjà essayé:

  1. setPalette(Qt::transparent);
  2. setAttribute( Qt::WA_TranslucentBackground, true );
  3. setAttribute( Qt::WA_OpaquePaintEvent, true );
  4. setAutoFillBackground(false);
  5. setStyleSheet("QWidget{background-color: transparent;}");
  6. setAttribute(Qt::WA_NoSystemBackground);
14
demandé sur sorush-r 2014-08-24 00:23:24

3 réponses

Ma meilleure supposition pour afficher un widget overlay, est de convertir le widget en une fenêtre, de le redimensionner à son contenu et de les déplacer à la position désirée manuellement.

exemple MainWindow, montrant le widget de superposition au centre du widget vidéo:

Mwindow::Mwindow()
{
    widget = new Widget(this);
}

void Mwindow::widgetSizeMove()
{
    if (widget->width() <= videoWidget->width() && widget->height() <= videoWidget->height())
    {
        widget->setWindowOpacity(1); // Show the widget
        QPoint p = videoWidget->mapToGlobal(videoWidget->pos());
        int x = p.x() + (videoWidget->width() - widget->width()) / 2;
        int y = p.y() + (videoWidget->height() - widget->height()) / 2;
        widget->move(x, y);
        widget->raise();
    }
    else
    {
        widget->setWindowOpacity(0); // Hide the widget
    }
}

bool Mwindow::event(QEvent *event)
{
    switch (event->type())
    {
    case QEvent::Show:
        widget->show();
        QTimer::singleShot(50, this, SLOT(widgetSizeMove())); 
        //Wait until the Main Window be shown
        break;
    case QEvent::WindowActivate:
    case QEvent::Resize:
    case QEvent::Move:
        widgetSizeMove();
        break;
    default:
        break;
    }

    return QMainWindow::event(event);
}

Exemple De Widget:

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    setWindowFlags(Qt::Window | Qt::FramelessWindowHint);

    setAttribute(Qt::WA_NoSystemBackground);
    setAttribute(Qt::WA_TranslucentBackground);
    setAttribute(Qt::WA_PaintOnScreen);

    setAttribute(Qt::WA_TransparentForMouseEvents);
}

void Widget::paintEvent(QPaintEvent*)
{
    QPainter p(this);
    QString text = "Some foo goes here";
    QFontMetrics metrics(p.font());
    resize(metrics.size(0, text));
    p.drawText(rect(), Qt::AlignCenter, text);
}

exemple de présentation D'une vidéo avec LibVLC:

VLC based player

13
répondu Antonio Dias 2014-08-25 13:56:40

sur Linux fonctionne avec:

setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_TransparentForMouseEvents);
5
répondu UndeadDragon 2015-06-02 12:39:09

La meilleure solution est fournie par Gökmen Göksel dans un des commentaires de ce article

setStyleSheet("background-color: rgba(0,0,0,0)");
5
répondu Slawek Rewaj 2017-04-24 07:12:23