2012-08-27 68 views
4

在我的GUI(C++,GTKMM 3)中,我有一個文本字段提供了一些狀態信息。我想根據狀態更改該字段的背景顏色(以及我可以輕鬆完成的文本)。在gtk文本字段中交換背景顏色(gtkmm C++)

有沒有很多關於如何使用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方式。

+0

我想通了解如何更改背景(在css文件中使用「背景」,而不是「背景色」)。但我似乎無法來回切換背景顏色。 – jasonmclose

+0

你可以分享一些你到目前爲止的代碼嗎? – alf

+0

增加了我到目前爲止的基本輪廓。 – jasonmclose

回答

2

你可以做掉與CSS和只使用override_background_color,一個標準的GTK控件的方法:

override_background_color (StateFlags state, RGBA color) 

設置背景色用的部件。

所有其他樣式值保持不變。

注意: 此API主要用於應用程序更改窗口小部件外觀的快速方法。如果您正在開發小部件庫並希望此更改具有主題性,則最好通過在小部件/容器實現中通過add_classadd_region設置有意義的CSS類和區域來完成。

這樣一來,你的控件庫可以以提供爲那些需要這麼一個小部件默認樣式安裝與STYLE_PROVIDER_PRIORITY_FALLBACK優先級的CssProvider,並且這種主題化可以由用戶的主題完全覆蓋。

注: 注意,對於複雜的部件,這可能在不想要的結果(如一致的背景色無處不在)帶來的,在這種情況下,最好是通過CssProvider完全樣式,例如小部件與STYLE_PROVIDER_PRIORITY_APPLICATION優先。

參數:

  • StateFlags state國家要爲其設置背景顏色
  • RGBA color顏色分配,或者爲null,撤銷之前的調用的效果override_background_color
+0

沒有。這在gtkmm3中不起作用。看我的帖子[這裏](http://www.gtkforums.com/viewtopic.php?f=3&t=178100&sid=a786a86ce500483f430a0a021e0eac83)。 gtkmm3中的override_background_color調用改變了突出顯示的文本的顏色,而不是小部件本身的顏色。這是行不通的。 – jasonmclose

+0

我會低調,但我沒有足夠的「積分」或任何(跛腳)。這不是解決方案。 – jasonmclose

相關問題