Kデスクトップ環境

3.8. OpenParts のピクスマップ と 配列 - OPUIUtils

ツールバーとメニューは、たいていQPixmapクラスを使ってピクスマップにより、装飾されます。 GUI要素にアクセスするCORBAインタフェースを用いると、QPixmapは、OpenParts のアプリケーション用OpenPartsUI::Pixmapになります。 OpenPartsUI::Pixmapは、ちょうど"stringified"(文字列化された)QPixmapで、opUIUtils.(h,cc)には使いやすい変換ルーチンが含まれています。

更に、OPUIUtilsには、CORBA::WChar*とQString間のストリング変換ルーチンを含んでいます。 これはQt バージョン>=2.0がQString経由で、Unicodeをサポートしているため必要となります。 全ての場所、メニュー及びツールバーのような明らかなGUI要素はこのサポートで変換されています。 OpenParts もインタフェースで"wstring" (CORBA::WChar *)を用い、変換ルーチンを使用し、提供したりすることによって変換されています。 これらのルーチンは、OPUIUtilクラスのスタティックメンバ関数で、まさにピクスマップ変換のようです。 用途を単純化するために、次の2つのマクロが定義されています:Q2CC2Q。 最初のマクロはQStringをCORBA::WChar *文字列に変換し、2つ目のマクロはその逆です。

QStringからCORBA::WChar *への変換では、変換ルーチンがメモリを割り当てます。 メモリリークを回避するには、CORBA::WString_var変数の使用を強くお勧めします。 正確には同じことが QPixmap ->OpenPartsUI::Pixmap変換にも適用されます:OpenPartsUI::Pixmap_varを使えばリークの心配はありません:-)。

これは、サンプルコードで、どのように行うかを表しています:
   1     ...
   2     OpenPartsUI::Pixmap_var pm = OPUIUtils::convertPixmap( QPixmap_variable_here );
   3     someToolBar->insertButton( pm, ... );
   4     ...
   5     // 同 pm 変数を再度使用
   6     pm = OPUIUtils::convertPixmap( another_qpixmap );
   7     ...

QStringの方を用いて行われなければならないことに類似:

   1     ...
   2     CORBA::WString_var text = Q2C( QString_here );
   3     someMenuBar->insertItem7( text, ... );
   4     ...
   5     // または次のようにもできます:
   6     someMenuBar->insertItem7( ( text = Q2C( QString_here ) ) , ...);
   7     ...

最後に残った注意点: Q2Cを使うことで関数の結果として"広義文字列"(CORBA::WChar *)を返す場合、絶対にCORBA::wstring_dup() を使わないでください。

例:
   1   return CORBA::string_dup( Q2C( QString_here ) ); //!!!! 警告!!!!!
   2   ...
   3   return Q2C( QString_here ); // 正! Q2C は既配列を割り当てています。