Qt — визуализировать QFrame с изображением в качестве фона без использования WA_TranslucentBackground

Мне нужно установить QFrame с фоновым изображением: http://imgur.com/RnSghvV. Вот что я попробовал:

setAutoFillBackground(true);
setWindowFlags(Qt::FramelessWindowHint);
setStyleSheet("background: transparent;");
QPalette p = this->palette();
p.setBrush(QPalette::Base, QPixmap("ipad.png"));
this->setPalette(p);

Вот что я получаю:

введите описание изображения здесь

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

P.S., можно заставить его работать, используя свойство Qt:: WA_TranslucentBackground, как видно Вот. Однако, в моем случае, QFrame будет содержать другие подвиджеты, некоторые из которых представляют собой QImages, отображаемые через OpenGL, и настройки Qt:: WA_TranslucentBackground делает эти изображения невидимыми в Windows. Поэтому я ищу решение, которое не использует это свойство.

Редактировать:

Основываясь на решении, предложенном Евгением, я попробовал это (я использовал 325 на 400 в качестве размеров для виджета, потому что это размеры изображения):

#include <QApplication>
#include <QLabel>
#include <QBitmap>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel l;
l.setWindowFlags(Qt::FramelessWindowHint);
QPixmap p(":/img/ipad.png");
l.setPixmap(p);
l.setScaledContents(true);
l.resize(300, 500); //just to test my idea
l.setMask(p.scaled(l.width(),l.height(),Qt::IgnoreAspectRatio,
Qt::SmoothTransformation).mask());
l.show();
return a.exec();
}

С этим это выглядит так:

введите описание изображения здесь

Правая сторона и низ по-прежнему показывают серый фон. Если я добавлю setStyleSheet("background: transparent")серый фон становится черным.

1

Решение

Хорошо, я наконец получил полностью рабочий пример с использованием setMask, Основная проблема в том, что у вашего изображения есть дополнительное пространство на границе. Это проблема для OSX. В Windows он отлично работает с оригинальным изображением, но для Mac я обрезал его.
Вы можете получить его здесь: http://smages.com/images/pic2016010ata.png

Тогда я мог бы получить рабочий пример на Mac с QFrame,

В .h файл:

#include <QFrame>
#include <QPixmap>

class TestFrame : public QFrame
{
Q_OBJECT
public:
TestFrame(QWidget* p = 0);

protected:
void resizeEvent(QResizeEvent* e) override;

private:
QPixmap _pix;
};

В .cpp файл:

#include <QBitmap>

TestFrame::TestFrame(QWidget *p) :
QFrame(p, Qt::FramelessWindowHint | Qt::WindowSystemMenuHint),
_pix(":/img/i2.png")
{
QPalette pal = palette();
pal.setBrush(QPalette::Background, QBrush(_pix));
setPalette(pal);
resize(_pix.width(), _pix.height());
}

void TestFrame::resizeEvent(QResizeEvent *e)
{
QFrame::resizeEvent(e);
setMask(_pix.scaled(size()).mask());
}

Вот скриншот на OS X

введите описание изображения здесь

Второе решение — использование QLabel вместо QFrame как это:

#include <QApplication>
#include <QLabel>
#include <QBitmap>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel l;
l.setWindowFlags(Qt::FramelessWindowHint);
QPixmap p(":/img/ipad.png");
l.setPixmap(p);
l.setScaledContents(true);
l.resize(300, 500); //just to test my idea
l.setMask(p.scaled(l.width(),l.height(),Qt::IgnoreAspectRatio,
Qt::SmoothTransformation).mask());
l.show();
return a.exec();
}
3

Другие решения

Изображение переднего плана в главном окне (в нашем случае с битами прозрачности) может быть применено так:

#include "mainwindow.h"#include <QLabel>
#include <QPixmap>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent, Qt::FramelessWindowHint)
{
setAttribute(Qt::WA_TranslucentBackground, true);
setStyleSheet("background-color: rgba(255, 255, 255, 255);"); // preventing child widgets from not being drawn

QLabel* pImageLabel = new QLabel;
QPixmap pixmap(":/RnSghvV.png");
pImageLabel->setPixmap(pixmap);

setCentralWidget(pImageLabel);
}

И QLabel является производным от QFrame, поэтому его можно применять в том же самом заполнителе. Имейте в виду, что, имея главное окно программы, вы должны также применить setAttribute(Qt::WA_TranslucentBackground, true),

1

По вопросам рекламы [email protected]