ツールバーとメニューは、たいてい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つのマクロが定義されています:Q2CとC2Q。 最初のマクロは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 は既配列を割り当てています。 |