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é:
setPalette(Qt::transparent);
setAttribute( Qt::WA_TranslucentBackground, true );
setAttribute( Qt::WA_OpaquePaintEvent, true );
setAutoFillBackground(false);
setStyleSheet("QWidget{background-color: transparent;}");
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:
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