9

Qtで「構成されたアイコン」のようなものを実装しようとしています。

ターゲット:アイコンの部分だけに動的に色を設定する必要があります。

私の考え:このアイコンを他の 2 つのアイコンで構成します。必要に応じて (おそらく ColorizeEffect によって) 色付けされ、オーバーレイ レイヤーとして機能する 2 番目のアイコンの下にブレンドされる 1 つのアイコン。

問題: QIconEngineを試し、そのペイントメソッドを実装しました。ColorizeEffect が機能していないようです (そのために一時的な QLabel を使用してハックを試みても - 強度が > 0.0 に設定されている場合、それによって形成される QIcon は空です)。しかし、それは主な問題ではありません。問題は、私が何をしても、この「構成された」アイコンのデフォルトの色付きの背景が得られることです。
QIcons を持つ 2 つの QToolButtons、左のアイコンは単純な QIcon、右のアイコンは私のものです


ここに私のコードの断片があります:

class QComposedIconEngine: public QIconEngine
{
public:
   QComposedIconEngine();
   ~QComposedIconEngine();
   virtual void paint ( QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state );
   virtual QIconEngine * clone(void) const;
public:
   QIcon m_qIconA;
   QIcon m_qIconB;
   QColor m_qColor;
};

そして、ここにペイント(...)の私の実装があります:

void CLxQComposedIconEngine::paint ( QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state )
{
   QBrush brush = painter->background();
   QColor color = brush.color();
   brush.setColor( Qt::transparent );
   painter->setBackground( brush );
   painter->eraseRect( rect );
   painter->setCompositionMode( QPainter::CompositionMode_SourceOver );
   m_qIconA.paint( painter, rect, Qt::AlignCenter, mode, state );
};

そして、これが「作成済み」アイコンの作成方法です。

QComposedIconEngine * qIconEngine = new QComposedIconEngine();
QIcon i1;
QIcon i2;
i1.addPixmap(...);
i2.addPixmap(...);
qIconEngine->m_qIconA = i1;
qIconEngine->m_qIconB = i2;
QIcon i3( qIconEngine );

i1 と i3 はまったく同じに見えると思います。そして、いまいましい背景に加えて、それは本当にです。しかし、私はそれを透明にする必要があります。

(paint(...) メソッドを空のままにしても、いまいましい背景がそこにあります!)

背景を透明にする方法を知っている人はいますか?ありがとう。

4

1 に答える 1

7

私はこれを解決しました。問題は、再実装されたpaint(...)メソッドがほぼ毎回pixmap(...)メソッドを介して呼び出されることでした-これも再実装できます。デフォルトの実装をそのままにしておくと、このメソッドは新しいQPixmapを作成し、その上に QPainter を作成し、このペインタに対してpaint(...)を呼び出します。しかし、それが問題です。作成された QPixmap にはアルファ チャネルが含まれていないため、半透明にすることはできません。したがって、次のように pixmap(...) メソッドを再実装する必要があります。

QPixmap CLxQComposedIconEngine::pixmap ( const QSize & size, QIcon::Mode mode, QIcon::State state )
{   
   QImage img( size, QImage::Format_ARGB32 );
   img.fill(qRgba(0,0,0,0));
   QPixmap pix = QPixmap::fromImage(img, Qt::NoFormatConversion );
   {
      QPainter painter ( &pix );
      QRect r( QPoint(0.0,0.0), size );
      this->paint(&painter, r, mode, state);      
   }
   return pix;       
};

キーは最初の 2 行です... img.fill()がないと透明になりません。

于 2014-12-23T07:46:24.363 に答える