2

我正在制作一个桌面轮播应用程序。在那里我需要显示图像小部件,它也可能包含其他子小部件。为此,我使用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);

但是,我得到了这个结果:

在此处输入图像描述

我也试过这个(从这里获得)(并删除样式表):

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

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

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

PS我知道在这里已经回答了类似的问题:QWidget transparent background (but not the children)和这里:Frameless and transparent window qt5但这些并不能解决我的问题。最后一个解决方案使我的 QFrame 看起来像这样:

在此处输入图像描述

QFrame 现在带有一个标题栏,这与我最初想要的完全不同。

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

4

2 回答 2

6

这段代码对我有用(在 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

主.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();
}

屏幕截图(在我的桌面背景前显示应用程序的窗口):

截屏

于 2015-06-23T18:35:41.290 回答
1

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

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

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);
}
于 2015-06-23T15:57:41.113 回答