我试图从一个小部件捕捉鼠标在事件上,这个小部件是我绘制pixmaps的QLabel的子类。我只需要通过将不透明度设置为50%来捕获此事件以创建透明效果。我试过setWindowOpacity(0.5)
没有成功。
所以,问题是:如何修改在作为QLabel的子类的窗口小部件中绘制的图像的不透明度?
PaintWidget.cpp
void PaintWidget::paintEvent(QPaintEvent *aEvent)
{
QLabel::paintEvent(aEvent);
if (_qpSource.isNull()) //no image was set, don't draw anything
return;
float cw = width(), ch = height();
float pw = _qpCurrent.width(), ph = _qpCurrent.height();
if (pw > cw && ph > ch && pw/cw > ph/ch || //both width and high are bigger, ratio at high is bigger or
pw > cw && ph <= ch || //only the width is bigger or
pw < cw && ph < ch && cw/pw < ch/ph //both width and height is smaller, ratio at width is smaller
)
_qpCurrent = _qpSource.scaledToWidth(cw, Qt::FastTransformation);
else if (pw > cw && ph > ch && pw/cw <= ph/ch || //both width and high are bigger, ratio at width is bigger or
ph > ch && pw <= cw || //only the height is bigger or
pw < cw && ph < ch && cw/pw > ch/ph //both width and height is smaller, ratio at height is smaller
)
_qpCurrent = _qpSource.scaledToHeight(ch, Qt::FastTransformation);
int x = (cw - _qpCurrent.width())/2, y = (ch - _qpCurrent.height())/2;
QPainter paint(this);
paint.drawPixmap(x, y, _qpCurrent);
}
void PaintWidget::setPixmap(const QPixmap& pixmap)
{
_qpSource = _qpCurrent = pixmap;
repaint();
}
答案 0 :(得分:2)
你在Linux或X11上工作吗?因此setWindowOpacity(0.5)
仅适用于window manager is composite。此外,即使这项工作正确,你仍然有麻烦。当您使用
QPainter paint(this);
paint.drawPixmap(x, y, _qpCurrent);
窗口的不透明度级别不能神奇地应用于像素图。您需要设置画家的不透明度,或者使用具有Alpha通道(定义透明度)的像素图。
答案 1 :(得分:0)
setWindowOpacity
不适合您的原因是您已覆盖paintEvent
。 QWidgetPrivate
内部有很多代码用于设置不透明度级别并绘制您可以查看的画布,因为您需要一种设置不透明度然后调用重绘的方法。
答案 2 :(得分:0)
我终于找到了解决方案。我在类中创建了一个表示不透明度值的局部变量,我还创建了下一个方法:
void PaintWidget::setOpacity(const double opacity)
{
this->opacity = opacity;
repaint();
}
并在paintEvent方法的末尾:
[...]
QPainter paint(this);
paint.setOpacity(opacity);
paint.drawPixmap(x, y, _qpCurrent);
[...]
}