带有pixmap的QLabel:防止pixmap在禁用状态下的颜色变化

时间:2018-05-03 09:57:48

标签: c++ qt

如何在禁用标签状态下控制像素图的颜色?

由于一些奇怪的原因,我需要在活动和禁用状态(显示的徽标)中具有完全相同的像素图外观。

当标签处于禁用状态时,我在label->setPixmap(pm)的QLabel上放置的像素图总是以与活动状态不同的颜色显示。

我努力使用样式表并尝试了QFrame:disabled{background-color: rgba(..., ..., ..., 255);},但是像素图覆盖的标签部分总是与另一种颜色混合,这似乎来自Qt对残疾状态的控制。

编辑:看来,Qt总是将像素图颜色和背景颜色混合在禁用状态。但Qt不会混合活跃状态的颜色;然后像素图颜色保持不透明。我需要关闭禁用状态的混合行为。

1 个答案:

答案 0 :(得分:2)

实现这一目标的方法(不是那么复杂)就是自己绘制像素图。您可以在标签中安装事件过滤器,而不是仅对QLabel进行子类化并覆盖paintEvent

有过滤器:

QPaintEvent

class Filter : public QObject { Q_OBJECT public: Filter(): QObject(nullptr) {} bool eventFilter(QObject *watched, QEvent *event); }; 方法中,总是返回false,但是当你绘制像素图时:

eventFilter

实例化并安装过滤器,例如:

#include <QPaintEvent>
#include <QPainter>
#include <QStyle>
bool Filter::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type() == QEvent::Paint)
    {
        QLabel * label = dynamic_cast<QLabel*>(watched);
        QPainter painter(label);

        QPixmap pixmap = label->pixmap()->scaled(label->size());        
        label->style()->drawItemPixmap(&painter, label->rect(), Qt::AlignHCenter | Qt::AlignVCenter, pixmap);
        return true;
    }
    return false;
}

在我的示例代码中,我缩放了像素图以适应标签大小并将其水平和垂直居中,但您可以根据需要调整所有这些。

此外,相同的过滤器可以安装到多个标签上,因为逻辑可以正常工作。有关事件过滤的更多信息here