Qt窗口小部件不透明度问题
我试图从一个小部件捕获鼠标悬停事件,该小部件是我在其中绘制pixmaps的QLabel的一个子类。我只需要捕捉这个事件,例如通过将不透明度设置为50%来创建透明度效果。我尝试了Qt窗口小部件不透明度问题,qt,widget,subclass,opacity,Qt,Widget,Subclass,Opacity,我试图从一个小部件捕获鼠标悬停事件,该小部件是我在其中绘制pixmaps的QLabel的一个子类。我只需要捕捉这个事件,例如通过将不透明度设置为50%来创建透明度效果。我尝试了setWindowOpacity(0.5),但没有成功 所以,问题是:我如何修改在QLabel子类的小部件中绘制的图像的不透明度 PaintWidget.cpp void PaintWidget::paintEvent(QPaintEvent *aEvent) { QLabel::paintEvent(aEvent
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();
}
void PaintWidget::paintEvent(QPaintEvent*aEvent)
{
QLabel::paintEvent(aEvent);
如果(qpSource.isNull())//未设置图像,则不要绘制任何内容
返回;
浮动cw=宽度(),ch=高度();
浮动pw=qpCurrent.width(),ph=qpCurrent.height();
如果(pw>cw&&ph>ch&&pw/cw>ph/ch | |///宽度和高度都较大,则高度处的比率较大或较小
pw>cw&&ph cw&&ph>ch&&pw/cw ch&&pw ch/ph//宽度和高度都较小,高度比较小
)
_qpCurrent=qpSource.scaledToHeight(ch,Qt::FastTransformation);
int x=(cw-qpucurrent.width())/2,y=(ch-qpucurrent.height())/2;
QPainter油漆(本);
绘制PIxMap(x,y,qpu-current);
}
void PaintWidget::setPixmap(constqpixmap和pixmap)
{
_qpSource=qpucurrent=pixmap;
重新油漆();
}
为什么setWindowOpacity
对您不起作用,是因为您已经覆盖了paintEvent
。QWidgetPrivate
中有很多代码用于设置不透明度级别和绘制画布,您可以查看这些代码,因为您已经进行了自定义绘制,您需要一种方法来设置不透明度,然后调用重绘 您是在Linux还是在X11上工作?因此setWindowOpacity(0.5)
只有在您的。此外,即使这项工作正常,你仍然有麻烦。使用应用pixmap时
QPainter paint(this);
paint.drawPixmap(x, y, _qpCurrent);
窗口的不透明度级别无法神奇地应用于pixmap。您需要设置画师的不透明度,或者使用具有alpha通道(定义透明度)的pixmap 我终于找到了解决办法。我在类中创建了一个表示不透明度值的局部变量,并且还创建了下一个方法:
void PaintWidget::setOpacity(const double opacity)
{
this->opacity = opacity;
repaint();
}
在paintEvent方法的末尾:
[...]
QPainter paint(this);
paint.setOpacity(opacity);
paint.drawPixmap(x, y, _qpCurrent);
[...]
}
pixmap是否有alpha通道??顺便问一下,你在谈论哪个函数
setOpacity()
?对不起,我想写“setWindowOpacity”。我不想修改pixmap,因为我不知道它的格式,只要设置小部件的不透明度,如果可能的话!我在应用程序的主窗口上测试了setWindowOpacity(0.5)
,效果很好。窗户是半透明的。佐藤:是的,我知道它能用。请阅读我的问题,我需要将不透明度应用到用于绘制pixmaps的自定义小部件(从QLabel继承)。最后,我的自定义小部件是一个QWidget,所以我不明白它为什么不工作。您在哪里(何时)使用setWindowOpacity(0.5)
,这就是我的建议:)。是的,这是真的!对不起,伙计,谢谢你的评论,所以:-)