1

我需要设置QFrame一个背景图片:http: //imgur.com/RnSghvV。这是我尝试过的:

setAutoFillBackground(true);
setWindowFlags(Qt::FramelessWindowHint);
setStyleSheet("background: transparent;");
QPalette p = this->palette();
p.setBrush(QPalette::Base, QPixmap("ipad.png"));
this->setPalette(p);

这就是我得到的:

在此处输入图像描述

如您所见,边缘有一个恼人的黑框,我想将其移除,并仅查看图像。我怎么做?

PS,可以通过使用属性使其工作Qt:: WA_TranslucentBackground,如此处所示。但是,在我的情况下,QFrame 将包含其他子小部件,其中一些是通过 OpenGL 渲染的 QImage,并且设置Qt:: WA_TranslucentBackground会使这些图像在 Windows 上不可见。所以我正在寻找一个不使用这个属性的解决方案。

编辑:

基于 Evgeny 提出的解决方案,我尝试了这个(我使用 325 x 400 作为小部件的尺寸,因为这些是图像的尺寸):

#include <QApplication>
#include <QLabel>
#include <QBitmap>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel l;
    l.setWindowFlags(Qt::FramelessWindowHint);
    QPixmap p(":/img/ipad.png");
    l.setPixmap(p);
    l.setScaledContents(true);
    l.resize(300, 500); //just to test my idea
    l.setMask(p.scaled(l.width(),l.height(),Qt::IgnoreAspectRatio,
    Qt::SmoothTransformation).mask());
    l.show();
    return a.exec();
}

有了这个,它看起来像这样:

在此处输入图像描述

右侧和底部仍然显示灰色背景。如果我添加setStyleSheet("background: transparent"),灰色背景变为黑色。

4

2 回答 2

4

好的,我终于得到了一个使用setMask. 主要问题是您的图像在边框上有额外的空间。这是 OSX 的问题。在 Windows 上,它适用于原始图像,但对于 mac,我已经剪掉了它。你可以在这里得到它:http://smages.com/images/pic2016010ata.png

然后我可以在 mac 上使用QFrame.

.h文件:

#include <QFrame>
#include <QPixmap>

class TestFrame : public QFrame
{
    Q_OBJECT
public:
    TestFrame(QWidget* p = 0);

protected:
    void resizeEvent(QResizeEvent* e) override;

private:
    QPixmap _pix;
};

.cpp文件:

#include <QBitmap>

TestFrame::TestFrame(QWidget *p) :
    QFrame(p, Qt::FramelessWindowHint | Qt::WindowSystemMenuHint),
    _pix(":/img/i2.png")
{
    QPalette pal = palette();
    pal.setBrush(QPalette::Background, QBrush(_pix));
    setPalette(pal);
    resize(_pix.width(), _pix.height());
}

void TestFrame::resizeEvent(QResizeEvent *e)
{
    QFrame::resizeEvent(e);
    setMask(_pix.scaled(size()).mask());
}

这是 OS X 上的屏幕截图

在此处输入图像描述

第二种解决方案是使用QLabel而不是QFrame这样:

#include <QApplication>
#include <QLabel>
#include <QBitmap>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel l;
    l.setWindowFlags(Qt::FramelessWindowHint);
    QPixmap p(":/img/ipad.png");
    l.setPixmap(p);
    l.setScaledContents(true);
    l.resize(300, 500); //just to test my idea
    l.setMask(p.scaled(l.width(),l.height(),Qt::IgnoreAspectRatio,
    Qt::SmoothTransformation).mask());
    l.show();
    return a.exec();
}
于 2016-01-06T17:41:16.683 回答
1

主窗口上的前景图像(在我们的例子中是透明位)可以这样应用:

#include "mainwindow.h"
#include <QLabel>
#include <QPixmap>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent, Qt::FramelessWindowHint)
{
    setAttribute(Qt::WA_TranslucentBackground, true);
    setStyleSheet("background-color: rgba(255, 255, 255, 255);"); // preventing child widgets from not being drawn

    QLabel* pImageLabel = new QLabel;
    QPixmap pixmap(":/RnSghvV.png");
    pImageLabel->setPixmap(pixmap);

    setCentralWidget(pImageLabel);
}

并且 QLabel 是从 QFrame 派生的,因此它可以应用在同一个占位符中。请注意,您还需要应用主程序窗口setAttribute(Qt::WA_TranslucentBackground, true)

于 2015-12-19T15:45:14.157 回答