Я делаю настольное приложение для карусели. Там мне нужно показать графические виджеты, которые могут содержать и другие подвиджеты. Для этого я использую 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.
Этот код работает для меня (протестировано под 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();
}
Снимок экрана (показывает окно приложения на фоне моего рабочего стола):
Можете ли вы попробовать эту легкую модификацию вашего кода?
Если это не работает, можете ли вы опубликовать свой компилируемый код в общедоступном репозитории? Это поможет воспроизвести в вашем точном контексте.
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);
}