Qt窗口小部件不透明度问题

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

我试图从一个小部件捕获鼠标悬停事件,该小部件是我在其中绘制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();
}
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)
,这就是我的建议:)。是的,这是真的!对不起,伙计,谢谢你的评论,所以:-)