2

私は gtk アプリケーションを書いていますが、私のテーマとうまくいきません。具体的には、アプリはわずか 50 ピクセル幅のツールバーに収まる必要があり、進行状況バーを含める必要がありますが、テーマには ProgressBar::min-horizo​​ntal-bar-width = 150 (これが既定値) があります。この特定のウィジェットがその特定のスタイル プロパティを無視できることをコードで gtk に伝えたいと思います。

システムのテーマを変更できることはわかっていますが、将来テーマに関連することを行うと、アプリケーションが壊れてしまいます。堅牢なソリューションを希望します。

また、テーマの残りの部分が維持されるソリューションを好むので、プログレスバーは正常に見えます (小さいことを除いて)。

編集:これはgtk3です

4

4 に答える 4

5

はい、できます。GTk+ 2 または 3 が必要かどうかを指定していません。

2 では、名前付きウィジェットにのみ適用されるコード内のリソースを作成することによってそれを行います。次に、進行状況バーの名前を設定できます。

char *custom_theme = "style \"Custom\" { ProgressBar::min-horizontal-bar-width = 10 }\n widget \"*.GtkProgressBar.my_progress_bar\" style \"Custom\"";

. . .

// After you've initialised the gtk system
gtk_rc_parse_string (custom_theme);

次に、テーマを無視するプログレスバーを作成するたびに、呼び出します

gtk_widget_set_name (progress_bar, "my_progress_bar");

カスタムスタイルを適用する必要があります。

テーマ システムは正しいパスを取得するのが難しいため、多少の調整が必要になる場合があります。

リソース ファイルのドキュメントはこちら: http://developer.gnome.org/gtk2/stable/gtk2-Resource-Files.html

ただし、これはすべて GTK+ 3 では非推奨になりましたが、それでも機能するはずですが、正しい方法は、ここで説明されている CSS スタイルを使用することです: http://developer.gnome.org/gtk3/stable/GtkCssProvider.htmlが、私はそれらがどのように機能するのかよくわからないことを認めなければなりませんが、似ていると思いますが、代わりに CSS のような構文を使用しています

于 2013-02-15T11:56:40.193 に答える
5

とった!正しい方向に向けてくれた@iainに感謝します。

GtkCssProvider* provider = gtk_css_provider_new();
const char* css = "GtkProgressBar#small { -GtkProgressBar-min-horizontal-bar-width: 1; }";
gtk_css_provider_load_from_data(provider, css, strlen(css), NULL);
GdkDisplay *display = gdk_display_get_default ();
GdkScreen *screen = gdk_display_get_default_screen (display);
gtk_style_context_add_provider_for_screen (screen,
                       GTK_STYLE_PROVIDER (provider),
                       GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_unref (provider);
peakProgressBar.set_name("small");
于 2013-02-15T19:53:30.013 に答える
2

ありがとう、これは私にとっても非常に役に立ちました。

画面に追加する代わりに、1 つのウィジェットに対して関数 gtk_widget_get_style_context() および gtk_style_context_add_provider() を使用できます...次のように:

void style_to_widget(GtkWidget * w, GtkStyleProvider * s)
{
    gtk_style_context_add_provider(gtk_widget_get_style_context(w),
                                   s, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
}
于 2013-03-02T21:02:42.837 に答える