0

ピックスマップをペイントする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();
}
4

3 に答える 3

2

Linux または X11 で作業していますか? したがって、ウィンドウ マネージャーが compositesetWindowOpacity(0.5)の場合にのみ機能します。さらに、これが正しく機能したとしても、まだ問題があります。でピックスマップを適用しているとき

 QPainter paint(this);
 paint.drawPixmap(x, y, _qpCurrent);

ウィンドウの不透明度を魔法のようにピックスマップに適用することはできません。ペインターの不透明度を設定するか、(透明度を定義する) アルファ チャネルを持つピックスマップを使用する必要があります。

于 2013-01-17T13:52:59.603 に答える
0

が機能しない理由setWindowOpacityは、をオーバーライドしたためpaintEventです。内部には、不透明度レベルを設定し、表示できるキャンバスをペイントするためのコードがたくさんありQWidgetPrivateます。カスタムペイントが発生しているため、不透明度を設定してから再ペイントを呼び出す方法が必要になります。

于 2013-01-17T13:31:51.910 に答える
0

私は最終的に解決策を見つけました。不透明度の値を表すクラスにローカル変数を作成し、次のメソッドも作成しました。

void PaintWidget::setOpacity(const double opacity)
{
    this->opacity = opacity;
    repaint();
}

そして、paintEvent メソッドの最後に:

    [...]
    QPainter paint(this);
    paint.setOpacity(opacity);
    paint.drawPixmap(x, y, _qpCurrent);
    [...]
}
于 2013-01-17T15:03:31.047 に答える