簡體   English   中英

帶像素圖的 QLabel:防止像素圖在禁用狀態下的顏色變化

[英]QLabel with pixmap: prevent pixmap's color change in disabled state

如何在禁用標簽狀態下控制其像素圖的顏色?

由於一些奇怪的原因,我需要在活動和禁用狀態(顯示徽標)下具有完全相同的像素圖外觀。

當標簽處於禁用狀態時,我放在帶有label->setPixmap(pm)的 QLabel 上的像素圖總是以與活動狀態不同的顏色顯示。

我在樣式表上苦苦掙扎並嘗試了QFrame:disabled{background-color: rgba(..., ..., ..., 255);}但被像素圖覆蓋的標簽部分總是與另一種顏色,似乎來自 Qt 對禁用狀態的控制。


編輯:看來,Qt 總是在禁用狀態下混合像素圖顏色和背景顏色。 但是 Qt 不會在活動狀態下混合顏色; 然后像素圖顏色保持不透明。 我需要關閉禁用狀態的這種混合行為。

實現這一目標的一種(不那么復雜)的方法是自己繪制像素圖。 您可以在標簽中安裝事件過濾器並僅偵聽QPaintEvent ,而不是子類化QLabel和覆蓋paintEvent

有過濾器:

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 */

在我的示例代碼中,我縮放像素圖以適應標簽大小並將其水平和垂直居中,但您可以根據需要調整所有這些。

此外,同一個過濾器可以安裝到多個標簽上,因為邏輯對它們都適用。 更多關於事件過濾在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM