4

GUI (C++、GTKMM 3) 内に、ステータス情報を提供するテキスト フィールドがあります。ステータスに基づいて、このフィールドの背景色を(テキストとともに、簡単に変更できます)変更したいと思います。

GTKMM 3.X でこれを行う方法はあまりありません。私は CssProvider クラスを使用する必要があることを知っており、プログラムにロードする方法の例をいくつか見つけました。ただし、例では、プロパティを一度に設定する方法を示しています。

しかし、私が理解していないのは、CSSプロパティを使用して、状態に基づいて背景の色を変更する方法です(「ホバー」などの状態ではありません。スワップできるようにしたいいつでも背景を赤から緑に変更してください)。CSS がウィジェットの名前またはウィジェットのタイプを使用して記述されている場合、ウィジェットの状態の変化をどのように処理してそのプロパティを変更しますか?

誰かが手がかりを持っているか、例を知っているなら、私は本当に助けを借りることができます. これの目的は、ユーザーに一目ですぐにフィードバックを提供することです。急いで、箱の状態を (または遠くから) 読み取る必要はありません。色により、何が起こっているかを一目で判断できます。

コードの追加

これは私がこれまでに試したことです(凝縮):

std::string style_sheet = ".red_bg {background: #FF0000; color: #000000; } ";
style_sheet += ".green_bg {background: #33FF33; color: #000000; }";
Glib::RefPtr<Gtk::StyleContext> stylecontext = my_text_field->get_style_context();
Glib::RefPtr<Gtk::CssProvider> cssprov = Gtk::CssProvider::create();
cssprov->load_from_data(style_sheet);
stylecontext->add_provider(cssprov, GTK_STYLE_PROVIDER_PRIORITY_USER);
stylecontext->add_class("red_bg");
stylecontext->context_save();

それでうまくいきます。プログラムが起動すると、赤い背景のテキスト エントリが表示されます。

しかし、後で、次のことを行っても何も起こりません:

Glib::RefPtr<Gtk::StyleContext>stylecontext = my_text_field->get_style_context();
stylecontext->remove_class("red_bg");
stylecontext->context_save();  // probably not necessary
stylecontext->add_class("green_bg");
stylecontext->context_save();

その時点で、背景は赤のままです。赤から緑への遷移はありません。GtkWidget オブジェクトで override_background_color 関数を使用する提案を見たことがありますが、それは機能しません。ウィジェット内のテキストを強調表示するときに使用される色のみを変更します。私はまだそれがCSSの方法で行われるのを見たいと思っています.

4

1 に答える 1

2

CSS を廃止して、標準の GTK ウィジェット メソッドであるoverride_background_colorを使用することができます。

override_background_color (StateFlags state, RGBA color)

ウィジェットに使用する背景色を設定します。

他のすべてのスタイル値は変更されません。

注: この API は主に、アプリケーションがウィジェットの外観を変更するための簡単な方法を意図しています。add_classウィジェット ライブラリを開発していて、この変更をテーマに対応させたい場合は、 と を使用して、ウィジェット/コンテナの実装に意味のある CSS クラスと領域を設定することをお勧めしますadd_region

このようにして、ウィジェット ライブラリは、必要なウィジェットにデフォルトのスタイルを提供するためにCssProviderSTYLE_PROVIDER_PRIORITY_FALLBACK優先順位を付けて をインストールできます。このテーマは、ユーザーのテーマによって完全にオーバーライドされる可能性があります。

注: 複雑なウィジェットの場合、これは望ましくない結果 (どこでも均一な背景色など) をもたらす可能性があることに注意してください。このような場合はCssProviderSTYLE_PROVIDER_PRIORITY_APPLICATION優先度を使用してそのようなウィジェットを完全にスタイル設定することをお勧めします。

パラメーター:

  • StateFlags state 背景色を設定する状態
  • RGBA color割り当てる色、または前の呼び出しの効果を元に戻す nulloverride_background_color
于 2012-09-05T07:47:53.560 に答える