具有背景图像和其他透明背景的 QFrame
QFrame with background image and otherwise transparent background
我正在制作桌面轮播应用程序。在那里我需要显示图像小部件,其中可能还包含其他 sub-widgets。为此,我使用 QFrame
并将所需图像作为背景。这是我尝试使用的图像:image link。我想要的是只显示图像,不显示背景图像或任何其他内容,因此对于用户来说它看起来就像图像一样。这是我的代码:
setGeometry(QRect(100, 20, 325,400));
setFrameStyle(QFrame::StyledPanel);
setStyleSheet("QFrame#ImageFrame { background-color: transparent; background: url(:icon/ipad-skin); }");
setAutoFillBackground(false);
但是,我得到的结果是:
我也试过了(从 here 获得)(并删除了样式表):
void MyWidget::paintEvent(QPaintEvent *p)
{
QPainter* pPainter = new QPainter(this);
pPainter->drawPixmap(rect(), QPixmap(":icon/newskin.png"));
delete pPainter;
QWidget::paintEvent(p);
}
没什么不同,结果完全一样。背景的灰色仍然显示。
如何让QFrame
的灰色背景只显示图片(我设置的尺寸和图片一样)?
P.S 我知道这里已经回答了类似的问题:QWidget transparent background (but not the children), and here: Frameless and transparent window qt5 但这些并不能解决我的问题。最后一个解决方案使我的 QFrame 看起来像这样:
QFrame 现在带有一个标题栏,这与我最初想要的完全不同。
Edit - 此解决方案有效,但在我的 use-case 中,我需要显示通过 QFrame 内的 GL 渲染的图像(具体来说,在视口中在 iPad 图像中,我们可以在此处看到)。在 Windows 中,设置 Qt::WA_TranslucentBackground
属性 会使 GL-rendered 图像不可见。不过,它在 Mac 中运行良好。所以我正在寻找一种也适用于 Windows 的解决方案。
你能尝试对你的代码进行这种简单的修改吗?
万一它不起作用,您可以在 public 存储库上发布您的可编译代码吗?这将有助于在您的确切上下文中重现。
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);
}
此代码适用于我(在 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();
}
屏幕截图(在我的桌面背景前显示应用程序的 window):
我正在制作桌面轮播应用程序。在那里我需要显示图像小部件,其中可能还包含其他 sub-widgets。为此,我使用 QFrame
并将所需图像作为背景。这是我尝试使用的图像:image link。我想要的是只显示图像,不显示背景图像或任何其他内容,因此对于用户来说它看起来就像图像一样。这是我的代码:
setGeometry(QRect(100, 20, 325,400));
setFrameStyle(QFrame::StyledPanel);
setStyleSheet("QFrame#ImageFrame { background-color: transparent; background: url(:icon/ipad-skin); }");
setAutoFillBackground(false);
但是,我得到的结果是:
我也试过了(从 here 获得)(并删除了样式表):
void MyWidget::paintEvent(QPaintEvent *p)
{
QPainter* pPainter = new QPainter(this);
pPainter->drawPixmap(rect(), QPixmap(":icon/newskin.png"));
delete pPainter;
QWidget::paintEvent(p);
}
没什么不同,结果完全一样。背景的灰色仍然显示。
如何让QFrame
的灰色背景只显示图片(我设置的尺寸和图片一样)?
P.S 我知道这里已经回答了类似的问题:QWidget transparent background (but not the children), and here: Frameless and transparent window qt5 但这些并不能解决我的问题。最后一个解决方案使我的 QFrame 看起来像这样:
QFrame 现在带有一个标题栏,这与我最初想要的完全不同。
Edit - 此解决方案有效,但在我的 use-case 中,我需要显示通过 QFrame 内的 GL 渲染的图像(具体来说,在视口中在 iPad 图像中,我们可以在此处看到)。在 Windows 中,设置 Qt::WA_TranslucentBackground
属性 会使 GL-rendered 图像不可见。不过,它在 Mac 中运行良好。所以我正在寻找一种也适用于 Windows 的解决方案。
你能尝试对你的代码进行这种简单的修改吗?
万一它不起作用,您可以在 public 存储库上发布您的可编译代码吗?这将有助于在您的确切上下文中重现。
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);
}
此代码适用于我(在 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();
}
屏幕截图(在我的桌面背景前显示应用程序的 window):