【问题标题】:QLabel with pixmap: prevent pixmap's color change in disabled stateQLabel with pixmap:防止像素图在禁用状态下的颜色变化
【发布时间】:2018-05-03 09:57:47
【问题描述】:

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

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

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

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


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

【问题讨论】:

  • 您看到了吗:stackoverflow.com/questions/36868434/…?你试过了吗?
  • @vahancho:是的,但它是关于按钮的,而我的案例是关于带有一组像素图的 QLabel。
  • This is the codeQLabel 上绘制像素图。如果您不需要任何QLabel 功能,您可以继承QWidget 并在那里绘制您的像素图。或者您可以创建自己的 QStyle 类并重新实现 QStyle::generatedIconPixmap 并将该样式设置为您的标签。或者继承QLabel 并重新实现paintEvent 方法。

标签: c++ qt


【解决方案1】:

实现这一点的一种(不那么复杂的)方法是自己绘制像素图。除了继承QLabel 并覆盖paintEvent,您可以在标签中安装一个事件过滤器并仅侦听QPaintEvent

有过滤器:

class Filter : public QObject
{
    Q_OBJECT
public:
    Filter(): QObject(nullptr) {}
    bool eventFilter(QObject *watched, QEvent *event);
};

在其eventFilter 方法中,总是返回false,但是当你绘制像素图时:

#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;
}

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

ui->setupUi(this);
Filter * filter = new Filter();
ui->label->installEventFilter(filter);

/* don't forget to call: 

    delete filter;
  
  somewhere later */

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

此外,同一个过滤器可以安装到多个标签上,因为逻辑适用于所有标签。更多关于事件过滤here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2021-12-08
    • 2019-03-01
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多