Мне нужно установить 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")
серый фон становится черным.
Хорошо, я наконец получил полностью рабочий пример с использованием setMask
, Основная проблема в том, что у вашего изображения есть дополнительное пространство на границе. Это проблема для OSX. В Windows он отлично работает с оригинальным изображением, но для Mac я обрезал его.
Вы можете получить его здесь:
Тогда я мог бы получить рабочий пример на 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();
}
Изображение переднего плана в главном окне (в нашем случае с битами прозрачности) может быть применено так:
#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)
,