如果我有一个带有像素图的 QLabel,并且 QLabel 被禁用,则像素图将自动转换为灰度。
有办法避免吗?
我有一个包含很多元素的大型 GUI。我想将其设置为禁用,但其中的一张图像仍然显示一些颜色。
有问题的 QLabel 本身已启用,但这并不重要,因为父小部件已禁用。
我尝试使用样式表删除颜色效果,但它不起作用:
setStyleSheet("QLabel { color: none; } QLabel:disabled { background: none; color: none; opacity: 1.0; }");
以下内容在样式表中也不起作用:
color: none !important;
color: unset !important;
我还尝试删除元素的 GraphicsEffect,但这也不起作用。
所讨论的元素深深嵌入在复杂且可调整大小的布局中,因此将其置于父窗口小部件之外并浮动在其上方将非常复杂。
对此有一个不太优雅的技巧。您可以更改
QLabel
的父级,启用它,并将其放置在正确的位置。我在一个过于简单的应用程序中对此进行了测试。
我在空窗口中丢了一个
QGroupBox
。然后我在该组框中放置了一个带有像素图的QLabel
。禁用组框确实会以灰色阴影显示图像。使用下面的代码(放入主窗口构造函数中)我将图像恢复为彩色。
QPoint globalPos = ui->label->mapToGlobal(ui->label->rect().topLeft()); // Store global position of label
ui->groupBox->setEnabled(false); // Disables the group box making the label "gray"
ui->label->setParent(this); // Transfers parenthood of the label to main window
ui->label->setEnabled(true);
ui->label->move(globalPos); // Places the label in proper location
ui->label->show(); // Sets the label visible
ui->label->raise(); // Sets the label are the foreground
show()
和 raise()
可能是必要的,也可能不是。在我的测试中,有时需要它们,有时则不需要。我没有花时间去弄清楚条件。
您可能还需要使用
globalPosition
进行调整。本质上,label
的初始坐标是相对于 groupBox
测量的。 mapToGlobal()
函数将这些位置转换为主窗口的坐标。但根据您执行操作的顺序,它可能会给您错误的数字。
所以,不是很优雅,但它有效。