2017-01-05 6 views
0

Я пытаюсь реализовать индикатор выполнения некоторого рода, с сеткой перед ним. У меня есть PNG с прозрачными «отверстиями» в нем, которые будут использоваться в качестве маски перед индикатором выполнения.Как накладывать/накладывать QLabels, которые содержат трехсторонние изображения PNG?

Я попытался создать QStackedLayout с двумя надписями в нем: один будет заполнен сплошным цветом, а другой будет содержать PNG для наложения.

Я думал, что QStackedLayout::StackAll позволит видеть все виджеты в макете.

QStackedLayout *stackedLayout = new QStackedLayout(ui->widget_progressbar); 
stackedLayout->setStackingMode(QStackedLayout::StackAll); 

label_fill = new QLabel(); 
label_fill->setFixedSize(100, 100); // just for testing 
label_fill->setStyleSheet("background-color: #669966"); 
stackedLayout->addWidget(label_fill); 

label_foreground = new QLabel(); 
label_foreground->setStyleSheet("border-image: url(:/img/mask.png) 0 0 0 0 stretch stretch;"); 
stackedLayout->addWidget(label_foreground); 

С вышеуказанным кодом зеленый прямоугольник находится на переднем плане, покрывая маску. Если я переупорядочу их дополнение к макету, или если я использую stackedLayout->setCurrentWidget(label_foreground); или label_foreground->raise();, то label_fill не отображается вообще. Прозрачные отверстия в PNG показывают цвет фона виджета, в котором находится макет. Это я подтвердил с изменением цвета родительского виджета, и я мог видеть измененный цвет в прозрачных отверстиях.

Я использую border-image в таблице стилей, чтобы изображение автоматически масштабировалось. Однако, используя стиль background-image или просто просто label_foreground()->setPixmap(...), он по-прежнему имеет такие же проблемы с прозрачностью.

Что такое «официальный» способ сделать это?

Конечно, если мне действительно нужно, я могу это сделать с редактированием QPixmaps, но тогда мне придется позаботиться об изменениях размера. Есть ли способ решить это с помощью макетов, не имея необходимость реализовать собственный менеджер компоновки?

Я думаю, что прибегну к использованию QGraphicsScene, но мне все еще интересно, есть ли решение с основными макетами.

+0

Посмотрите на QWidget :: autoFillBackground документации. Там есть предупреждение, что это свойство отключено, когда вы используете таблицу стилей с пограничным изображением, которое у вас есть. Я не уверен, каков эффект этого, но вместо использования таблиц стилей вы можете использовать setPixmap вместо этого. – goug

+0

@goug: К сожалению, то же самое происходит и с setPixmap, как уже упоминалось в вопросе. – vsz

+0

Я перечитал вопрос, и вы на самом деле не сказали, что попробовали это с помощью setPixmap, а не с таблицами стилей. Возможно, вы подразумевали это, но это, конечно, не ясно. – goug

ответ

1

Проблема заключалась в том, что мой label_foreground унаследовал таблицу стилей своего родителя (ui->widget_progressbar), поэтому он имел сплошной цвет фона. В прозрачных отверстиях PNG-изображения это был не тот родитель, которого я видел, а цвет фона самой метки.

Добавление прозрачного фона на этикетке решить эту проблему: теперь он правильно показывает другие виджеты под ним через прозрачные части изображения:

label_foreground->setStyleSheet("background-color: rgba(0,0,0,0); border-image: url(:/img/mask.png) 0 0 0 0 stretch stretch;");