C++ 具有背景图像和其他透明背景的QFrame

C++ 具有背景图像和其他透明背景的QFrame,c++,qt,background-image,qframe,C++,Qt,Background Image,Qframe,我正在制作一个桌面旋转木马应用程序。在那里,我需要显示图像小部件,其中可能还包含其他子小部件。为此,我使用了一个QFrame,以所需的图像作为背景。以下是我尝试使用的图像:。我想要的是,只有图像显示,没有背景图像或任何显示,以及,所以对用户来说,它看起来只是图像。这是我的密码: setGeometry(QRect(100, 20, 325,400)); setFrameStyle(QFrame::StyledPanel); setStyleSheet("QFrame#ImageFrame { b

我正在制作一个桌面旋转木马应用程序。在那里,我需要显示图像小部件,其中可能还包含其他子小部件。为此,我使用了一个
QFrame
,以所需的图像作为背景。以下是我尝试使用的图像:。我想要的是,只有图像显示,没有背景图像或任何显示,以及,所以对用户来说,它看起来只是图像。这是我的密码:

setGeometry(QRect(100, 20, 325,400));
setFrameStyle(QFrame::StyledPanel);
setStyleSheet("QFrame#ImageFrame { background-color: transparent; background: url(:icon/ipad-skin); }");
setAutoFillBackground(false);
然而,我得到的结果是:

我也尝试过(从中获得)(并删除样式表):

没什么不同,结果完全一样。背景的灰色仍然显现出来

如何使
QFrame
的灰色背景仅显示图像(我设置的尺寸与图像相同)

注:我知道类似的问题已经在这里得到了回答:,在这里:但这些并不能解决我的问题。最后一个解决方案使我的QFrame看起来像这样:

QFrame现在提供了一个标题栏,它根本不是我想要的


编辑-此解决方案可行,但在我的使用案例中,我需要在QFrame内显示通过GL渲染的图像(具体来说,在我们可以在此处看到的iPad图像的视口中)。在Windows中,设置
Qt::WA_TranslucentBackground
属性可使GL渲染图像不可见。不过,它在Mac中运行良好。因此,我正在寻找一个解决方案,这将工作在Windows以及

您可以尝试对代码进行这种轻微修改吗

如果它不起作用,您能否将可编译代码发布到公共存储库中?这将有助于在您的确切上下文中重现

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或更高版本下工作):

主要条款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
#如果主
#定义主
#包括
#包括
类MyFrame:publicqframe
{
公众:
MyFrame(QWidget*父项);
虚拟虚空paintEvent(QPaintEvent*e);
私人:
qpixmapu pixmap;
};
#恩迪夫
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();
}
#包括
#包括
#包括“main.h”
MyFrame::MyFrame(QWidget*parent):QFrame(parent,Qt::Window | Qt::FramelessWindowHint)
{
setAttribute(Qt::WA_半透明背景);
_加载(“/Users/jaf/iPad_Vector.png”);
调整大小(_pixmap.size());
}
void MyFrame::paintEvent(QPaintEvent*/*e*/)
{
油漆工p(本);
p、 drawPixmap(0,0,宽度(),高度(),_pixmap);
}
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
MyFrame f(空);
f、 show();
返回app.exec();
}
屏幕截图(在我的桌面背景前显示应用程序的窗口):


我不明白,你想要的结果会是什么样子?你是否看到灰色背景从图像中向各个方向突出?我不想看到这一点。只是图像。嗯,不,不是。在这里下载并检查:你是对的,我只是在firefox中查看了它,它也以白色/灰色呈现了透明边框。那我该怎么做呢?知道吗?嗯,我需要多次更改皮肤图像。那么这个解决方案将如何工作呢?顺便说一句,我已经尝试过了(参见我问题中的第二个解决方案)。它给出了相同的结果。@Cupidvogel您是否看到带有以下内容的行:
ppainer->setBackgroundMode(Qt::TransparentMode)?注意:如果您需要更改为不同的pixmap,您可以再次调用_pixmap.load(“some_other_image.png”),然后调用update(),或者如果您想更有效地执行此操作,可以在启动时加载多个QPixmap成员变量,并选择适当的变量调用drawPixmap(),inside paintEvent()。(再次调用update()以强制再次调用paintEvent())谢谢!工作得很有魅力!顺便说一句,这些图片在拐角处看起来有点粗糙。每一分钟,你都得盯着屏幕去发现它,但它就在那里。但实际图像是平滑的。有没有办法解决这个问题?你可以试着用不同的值在QPaint上调用setRenderInt(),看看它是否有什么不同;但我不知道会发生什么。你是个天使<代码>QPaint::SmoothPixmapTransform
成功了!
#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();
}