Я пытаюсь реализовать индикатор выполнения некоторого рода, с сеткой перед ним. У меня есть 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
, но мне все еще интересно, есть ли решение с основными макетами.
Посмотрите на QWidget :: autoFillBackground документации. Там есть предупреждение, что это свойство отключено, когда вы используете таблицу стилей с пограничным изображением, которое у вас есть. Я не уверен, каков эффект этого, но вместо использования таблиц стилей вы можете использовать setPixmap вместо этого. – goug
@goug: К сожалению, то же самое происходит и с setPixmap, как уже упоминалось в вопросе. – vsz
Я перечитал вопрос, и вы на самом деле не сказали, что попробовали это с помощью setPixmap, а не с таблицами стилей. Возможно, вы подразумевали это, но это, конечно, не ясно. – goug