我有一个非常简单的应用程序,呈现一个半透明度的透明小部件。一切都适用于默认环境平台(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 ®ion, 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
?