- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 QLabel
作为一个强大的工具来将一些带有 CSS 的文本渲染到纹理中。获取图像后,在 OpenGL 中形成纹理并丢弃原始 Qt 对象。之后,我在普通 OpenGL(无 Qt)渲染管道中使用该纹理作为任何其他纹理。
但是,我在处理背景透明度时遇到了问题。某些东西 - 可能是一些我不知道的 Qt 设置 - 似乎弄乱了我的设置。
经过一些简化,我的纹理是这样产生的:
QLabel label;
label.setAttribute(Qt::WA_TranslucentBackground, true);
const QString styleSheet{"color : #00bbbb; background-color : rgba(0,0,0,0);"
"font-family: 'Calibri'; text-decoration: none; margin: 5px;"};
label.setWordWrap(true);
label.setAutoFillBackground(false);
label.setStyleSheet(styleSheet);
QFont font = label.font();
font.setPointSizeF(12.0f);
label.setFont(font);
// set text
label.setText(QString("The quick brown fox jumps over the lazy dog"));
// render
label.adjustSize();
label.updateGeometry();
std::unique_ptr<QImage> imgTexture = std::make_unique<QImage>(label.size(), QImage::Format_RGBA8888);
QPainter painter(imgTexture.get());
label.render(&painter);
uint8_t *bits = imgTexture->bits();
std::cout << int(bits[0]) << " " << int(bits[1]) << " " << int(bits[2]) << " " << int(bits[3]) << std::endl;
输出 - 生成图像左上角像素的值 - 是:
205 205 205 205
而不是我预期的 0 0 0 0。因此,问题已经出现在这一点上,而不是稍后出现在我对纹理的 OpenGL 处理中。最终我的输出是:
正如所见,背景并不像预期的那样完全透明。
更新
根据 G.M. 的建议,我尝试了 setCompositionMode
(没有效果),但也尝试了其他画家设置。显然将 QPainter::setBackgroundMode
设置为 Qt::OpaqueMode
更进一步:
Qt 手册说:
Qt::TransparentMode (the default) draws stippled lines and text without setting the background pixels. Qt::OpaqueMode fills these space with the current background color.
因此,默认设置似乎是不在不存在字母的任何地方更改输出图像的原始像素。因此,透明的 (0,0,0,0) 没有被绘制,并且之前的颜色(由于某种原因显然是 205, 205, 205, 205)保持不变。
强制绘制背景会更新所有像素,但仅限于字母附近的像素。我现在需要弄清楚如何强制将 所有 像素清除为 CSS 中指定的颜色。
更新 显然它并不像看起来那么简单。我尝试了 painter.eraseRect(0, 0, width, height);
但这会将矩形清除为白色,忽略 CSS 设置。
最佳答案
结合实验结果和一些评论。该行为是以下各项的组合:
当 QImage
构造有一些图像区域时,该区域未初始化。
QImage::QImage(int width, int height, QImage::Format format)
Constructs an image with the given width, height and format.
A null image will be returned if memory cannot be allocated.
Warning: This will create a QImage with uninitialized data. Call fill() to fill the image with an appropriate pixel value before drawing onto it with QPainter.
在 Debug模式下的 Visual Studio 中,未初始化的区域使用 0xCD
进行初始化。在 Release 中会是一些垃圾
默认情况下,当使用QPainter 绘制文本时,背景保持不变。画家只是将字形添加到目标图像上先前存在的任何内容(在我们的例子中:未初始化的区域)。
void QPainter::setBackgroundMode(Qt::BGMode mode)
Sets the background mode of the painter to the given mode
Qt::TransparentMode (the default) draws stippled lines and text without setting the background pixels. Qt::OpaqueMode fills these space with the current background color.
Note that in order to draw a bitmap or pixmap transparently, you must use QPixmap::setMask().
因此,为了按照 QLabel 的 CSS 中的设置绘制背景像素,需要将模式更改为 Qt::OpaqueMode
。然而,这只在字形周围绘制,而不是整个区域。我们需要先手动清理整个区域。
图像可以通过QPainter::fillRect
清除:
void QPainter::fillRect(int x, int y, int width, int height, const QColor &color)
This is an overloaded function.
Fills the rectangle beginning at (x, y) with the given width and height, using the given color.
This function was introduced in Qt 4.5.
但有一个警告 - 所有 QPainter
操作都与底层图像混合。默认情况下,它会考虑绘图颜色的 alpha channel 。因此,如果你用 (0,0,0,0) 绘画,你会得到......没有变化。混合操作由以下因素控制:
void QPainter::setCompositionMode(QPainter::CompositionMode mode)
Sets the composition mode to the given mode.
Warning: Only a QPainter operating on a QImage fully supports all composition modes. The RasterOp modes are supported for X11 as described in compositionMode().
See also compositionMode().
enum QPainter::CompositionMode
Defines the modes supported for digital image compositing. Composition modes are used to specify how the pixels in one image, the source, are merged with the pixel in another image, the destination. [...] When a composition mode is set it applies to all painting operator, pens, brushes, gradients and pixmap/image drawing.
Constant Value Description
QPainter::CompositionMode_SourceOver 0 This is the default mode. The alpha of the source is used to blend the pixel on top of the destination.
QPainter::CompositionMode_DestinationOver 1 The alpha of the destination is used to blend it on top of the source pixels. This mode is the inverse of CompositionMode_SourceOver.
QPainter::CompositionMode_Clear 2 The pixels in the destination are cleared (set to fully transparent) independent of the source.
QPainter::CompositionMode_Source 3 The output is the source pixel. (This means a basic copy operation and is identical to SourceOver when the source pixel is opaque).
QPainter::CompositionMode_Destination 4 The output is the destination pixel. This means that the blending has no effect. This mode is the inverse of CompositionMode_Source.
[...] (30 more modes...)
因此,在调用fillRect
之前,需要将默认的SourceOver
替换为Source
。
清除也可以通过QImage::fill
来完成。绘制模式更容易,不会造成困惑!
不幸的是,任一解决方案(QImage::fill
或QPainter::fillRect
)都需要明确指定背景颜色。它不能只从 QLable 的 CSS 中读取。
附言我不知道如何 block 引用表格:(
关于c++ - 渲染一个透明的 QLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58889139/
我想禁用我的 UIButton,所以我调用: button.enabled = FALSE; 然而,这会使按钮变得透明,我可以看到它下面的元素。我不介意它改变颜色,我只是不希望它是透明的。 我尝试在
一个常规的 NSButton 如果被禁用,它似乎是透明的。 图像显示了一个样式为“push”的按钮 但是,我想禁用没有透明度的按钮。 我试图以编程方式将 alphaValue 设置为 1.0 但似乎
我正在尝试将Memoji从iPhone/Mac转换为具有透明背景的一系列png,以便我可以创建一个 Sprite 表。当按下空格键时,我可以清楚地看到它具有透明背景,但是在运行 ffmpeg -i s
我想创建一个具有部分透明背景的 View (舞台、窗口)。我有一张包含 Alpha channel 的图像 我在JavaFx中使用了这种场景,我必须将场景填充设置为空,并将根节点背景颜色设置为透明。我
我想创建一个具有部分透明背景的 View (舞台、窗口)。我有一张包含 Alpha channel 的图像 我在JavaFx中使用了这种场景,我必须将场景填充设置为空,并将根节点背景颜色设置为透明。我
我想将 JDesktopPane 设置为透明,并允许我单击下面的内容(例如桌面图标等)。内部框架应保持不透明,并且能够像当前一样在屏幕周围重新定位。有什么想法吗? package test1;
我知道我不是第一个提出此类问题的人,但我认为我的问题有点不同。 我在 MS Paint 上绘制了一个 png 图像,它是一个播放器,当我使用图形对象绘制图像时,我希望图像的背景是透明的。我尝试了一些带
我在 Mac 的 swift 项目中想使用单选按钮,但与我的背景颜色相同。如何将背景设置为不透明或更改背景颜色? 最佳答案 我找到了解决此问题的方法。将单选按钮的文本设置为“”,将 rb 添加到水平堆
我无法将我的相对布局设置为透明。我尝试了很多不同的方法,从类中自定义 View ,添加 android:background="@android:color/transparent"等。它们要么像下图
在 Storyboard中,我创建了一个 ![UINavigationController] 及其 Root View Controller UIViewcontroller。在工具栏中,我有一个分段
我必须让我的导航栏透明,我试过这段代码: self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIB
我注意到,如果我将 View 背景颜色设置为透明,则在 segue 过渡结束后背景颜色会变成黑色(我猜这是默认的“视口(viewport)”颜色)。 我可以改变吗?当然,我可以将颜色从透明更改为紫色,
嘿,有没有可能让滚动条“隐藏”,我不想使用 overflow-y: hidden就像背景:透明或类似的东西 最佳答案 Here您会找到有关如何仅使用 CSS 隐藏滚动条的说明。 在第二个example
默认情况下,背景显示为白色。是否可以通过任何方式将其背景颜色更改为透明..? (function() { var cx = '005519348941191855053:d0uziw7c
我正在尝试添加一个在 div 的左右边缘具有透明度/淡出的嵌入框阴影。我设法添加了一个普通的嵌入框阴影,但我不知道如何为边缘添加透明度。我该怎么做? 这是我正在努力实现的一个例子。 .contai
如何删除 周围的边框并使其背景透明? 最佳答案 试试这个: border: none; border-color: transparent; 关于html - 透明、无边框的文本输入,我们在Stac
是否可以使 JButton 透明(包括边框)而不是文本?我扩展了 swing 的 JButton 并覆盖了它: @Override public void paint(Graphics g) {
众所周知,要使QWidget/QOpenGLWidget半透明/透明,只需: widget->setAttribute(Qt::WA_TranslucentBackground) 但是,由于 QWin
我想知道如何在 Ubuntu 中为所有应用程序制作透明 Gnome 终端,我知道我们可以为桌面制作透明终端,而不是为所有应用程序制作透明终端。我用谷歌搜索了很多,但找不到任何解决方案。谁能告诉我该怎么
我想让 SWT Canvas 的背景透明,以便可以看到它后面的其他小部件。 我尝试将 alpha 设置为 0 并用矩形填充 Canvas ,并且还使用选项 SWT.NO_BACKGROUND 无济于事
我是一名优秀的程序员,十分优秀!