Qt没有将alpha通道呈现给平台插件

时间:2015-04-17 14:08:44

标签: c++ qt

我有一个非常简单的应用程序,呈现一个半透明度的透明小部件。一切都适用于默认环境平台(X11等)。

class TestWidget : public QWidget
{
public:
    TestWidget(QWidget* parent = 0) : QWidget(parent)
    {
        this->setWindowOpacity(.5);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    TestWidget widget;

    QCheckBox* checkBox = new QCheckBox(&widget);
          checkBox->setObjectName(QStringLiteral("checkBox"));
          checkBox->setGeometry(QRect(0, 0, 89, 20));

    widget.setGeometry(QRect(0, 0, 240, 320));

    widget.show();

    return app.exec();
}

这可以按预期工作。

但是,如果使用我开发的自定义平台插件(基于最小示例),渲染图像没有alpha图层。

注意: 事实证明qt中的最小平台也是如此,但为了以防万一,我也会展示我的平台代码。

这是平台屏幕。

QEncirisPlatformScreen::QEncirisPlatformScreen()
    : mDepth(32),
      mFormat(QImage::Format_ARGB32_Premultiplied),
      mGeometry(QRect(0, 0, 240, 320))
{

}

QEncirisPlatformScreen::~QEncirisPlatformScreen()
{

}

QRect QEncirisPlatformScreen::geometry() const
{
    return mGeometry;
}

int QEncirisPlatformScreen::depth() const
{
    return mDepth;
}

QImage::Format QEncirisPlatformScreen::format() const
{
    return mFormat;
}

这是支持商店。

QEncirisPlatformBackingStore::QEncirisPlatformBackingStore(QWindow *window)
    : QPlatformBackingStore(window)
    , mDebug(QEncirisPlatformIntegration::instance()->options() & QEncirisPlatformIntegration::DebugBackingStore)
{
    if (mDebug)
        qDebug() << "QMinimalBackingStore::QMinimalBackingStore:" << (quintptr)this;
    mImage = new QImage(window->size(), QImage::Format_ARGB32_Premultiplied);
    mImage->fill(Qt::transparent);
}

QEncirisPlatformBackingStore::~QEncirisPlatformBackingStore()
{
}

QPaintDevice *QEncirisPlatformBackingStore::paintDevice()
{
    if (mDebug)
        qDebug() << "QMinimalBackingStore::paintDevice";

    return &(*mImage);
}

void QEncirisPlatformBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
{
    Q_UNUSED(window);
    Q_UNUSED(region);
    Q_UNUSED(offset);

    if (mDebug)
    {
        static int c = 0;
        QString filename = QString("output%1.png").arg(c++, 4, 10, QLatin1Char('0'));
        qDebug() << "QMinimalBackingStore::flush() saving contents to" << filename.toLocal8Bit().constData();
        mImage->save(filename);

        // this is false
        qDebug() << "Has alpha " << mImage->data_ptr()->checkForAlphaPixels();
    }
}

void QEncirisPlatformBackingStore::resize(const QSize &size, const QRegion &)
{
    QImage::Format format = QGuiApplication::primaryScreen()->handle()->format();
    if (mImage->size() != size)
        mImage = new QImage(size, format);
}

保存到文件系统的图像显示正确的小部件,但没有Alpha透明度。背景似乎是#efebe7(tan)的颜色,我没有在任何地方设置。

如何让我的支持商店拥有包含alpha / opacity的mImage

0 个答案:

没有答案