QFrame с фоновым изображением и другим прозрачным фоном

Я делаю настольное приложение для карусели. Там мне нужно показать графические виджеты, которые могут содержать и другие подвиджеты. Для этого я использую QFrame с требуемым изображением в качестве фона. Вот изображение, которое я пытаюсь использовать: ссылка на изображение. Я хочу, чтобы отображалось только изображение, фоновое изображение или что-то еще, так что для пользователя это выглядит как изображение. Вот мой код:

setGeometry(QRect(100, 20, 325,400));
setFrameStyle(QFrame::StyledPanel);
setStyleSheet("QFrame#ImageFrame { background-color: transparent; background: url(:icon/ipad-skin); }");
setAutoFillBackground(false);

Тем не менее, я получаю это в результате:

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

Я тоже это пробовал (получено из Вот) (и удаление таблицы стилей):

void MyWidget::paintEvent(QPaintEvent *p)
{
QPainter* pPainter = new QPainter(this);
pPainter->drawPixmap(rect(), QPixmap(":icon/newskin.png"));
delete pPainter;
QWidget::paintEvent(p);
}

Ничего особенного, точно такой же результат. Серость фона все еще показывает.

Как мне сделать серый фон QFrame пойти и отобразить только изображение (размеры, которые я задаю, совпадают с изображением)?

П.С. Мне известно, что на подобные вопросы здесь ответили: QWidget прозрачный фон (но не дети), и здесь: Безрамное и прозрачное окно qt5 но это не решает мою проблему. Последнее решение заставляет мой QFrame выглядеть так:

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

QFrame теперь поставляется со строкой заголовка, которая совсем не то, что я хотел в первую очередь.

редактировать — Это решение работает, но в моем сценарии использования мне нужно отобразить изображение, отображаемое с помощью GL внутри QFrame (в частности, в окне просмотра на изображении iPad, которое мы можем увидеть здесь). В Windows настройка Qt::WA_TranslucentBackground свойство делает GL-визуализированное изображение невидимым. Тем не менее, он отлично работает в Mac. Поэтому я ищу решение, которое будет работать и в Windows.

2

Решение

Этот код работает для меня (протестировано под MacOS / X 10.10.3, с использованием Qt 5.5.0-beta; хотя я ожидаю, что он будет работать под любой версией Qt 4.5.0 или выше):

main.h:

#ifndef main_h
#define main_h

#include <QFrame>
#include <QPixmap>

class MyFrame : public QFrame
{
public:
MyFrame(QWidget * parent);

virtual void paintEvent(QPaintEvent * e);

private:
QPixmap _pixmap;
};

#endif

main.cpp:

#include <QApplication>
#include <QPainter>
#include "main.h"
MyFrame :: MyFrame(QWidget * parent) : QFrame(parent, Qt::Window|Qt::FramelessWindowHint)
{
setAttribute(Qt::WA_TranslucentBackground);

_pixmap.load("/Users/jaf/iPad_Vector.png");
resize(_pixmap.size());
}

void MyFrame :: paintEvent(QPaintEvent * /*e*/)
{
QPainter p(this);
p.drawPixmap(0,0,width(),height(), _pixmap);
}

int main(int argc, char ** argv)
{
QApplication app(argc, argv);

MyFrame f(NULL);
f.show();

return app.exec();
}

Снимок экрана (показывает окно приложения на фоне моего рабочего стола):

Скриншот

6

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

Можете ли вы попробовать эту легкую модификацию вашего кода?

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

void MyWidget::paintEvent(QPaintEvent *p)
{
QPainter* pPainter = new QPainter(this);
pPainter->setBackgroundMode(Qt::TransparentMode);
pPainter->drawPixmap(rect(), QPixmap(":icon/newskin.png"));
delete pPainter;
QWidget::paintEvent(p);
}
1

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