gpt4 book ai didi

c++ - 带有像素图 : prevent pixmap's color change in disabled state 的 QLabel

转载 作者:行者123 更新时间:2023-11-30 02:20:05 25 4
gpt4 key购买 nike

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

出于一些奇怪的原因,我需要在事件和禁用状态(显示 Logo )下具有完全相同的像素图外观。

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

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


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

最佳答案

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

有过滤器:

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

在它的eventFilter方法中,总是返回false,但是当你绘制pixmap时:

#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 .

关于c++ - 带有像素图 : prevent pixmap's color change in disabled state 的 QLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50152156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com