[英]How to have a transparent widget in a non transparent window?
我目前正在使用libgtkmm和libvte在C ++中創建終端仿真器。
我的目的是在其他地方有一個透明的終端小部件和一個不透明的窗口; 但是我找不到關於小部件透明度的任何信息。
我試過了
GdkRGBA background = {0., 0., 0., .5};
vte_terminal_set_color_background(VTE_TERMINAL(terminal), &background);
和/或
set_opacity(.5); // set opacity of the container
例如,但它不起作用。 我想這是使用Gdk曲面的技巧,但是我無法弄清楚。
我正在尋找解釋,文檔,線索等...
謝謝 !
編輯:
我想查看小部件下方的桌面(好像窗口中的不透明度為0)。 但是,如果我修改窗口的不透明度:
this->set_opacity(0.5);
整個窗口被修改,而不僅僅是窗口小部件的區域...
我希望它看起來像這樣:
我已經習慣了通過Glade做所有事情。 所以我將從那開始。 我可以通過'opacity'屬性使任何小部件透明:
<object class='GtkWhatever' id='Whatever'>
<property name="opacity">0.29999999999999999</property>
<child>
...
</child>
<child>
...
</child>
</object>
這樣,所有孩子都變得透明,這是有道理的。
然后,我嘗試使用set_opacity
,最可能的錯誤原因是您完全按照編寫的方式調用了它,這當然會設置從中調用它的對象的不透明度,並且通常是應用程序窗口。
您需要在要使其透明的對象上調用它(其所有子對象將因此變為透明)。
所以你有了:
class MyWindow : public Gtk::ApplicationWindow
{
private Gtk::Widget *someWidget;
};
讓我們假設您很好地創建了這個someWidget
並將其添加到窗口中。 然后,您可以執行以下操作:
someWidget->set_opacity(0.5);
我嘗試過時它在這里起作用,因此它也應該為您工作。 如果沒有,請提供更多細節,我將盡力提供幫助。
在您發表評論后,我發現我誤解了您想要的東西。
不透明度實際上並不能以您想要的方式起作用。 您不能降低父級在子級中的不透明度,只能控制父級以及if的所有子級中的不透明度。
因此,假設您有:
Gtk::ApplicationWindow *window
Gtk::Box *box
Gtk::Menu *menu
Gtk::Grid *grid
Gtk::Widget *w1
Gtk::Widget *w2
Gtk::Widget *w3
Gtk::Widget *w4
Gtk::Button *button
w3的顯示方式可以看成是:
*w3
的不透明度將*w3
繪制到*grid
*grid
的不透明度將*grid
繪制到*box
上 *box
的不透明度將*box
繪制到*window
上 *window
的不透明度將*window
繪制到屏幕上 請記住,繪制函數的調用順序實際上與此相反,父級負責繪制子級。
因此,每個對象的不透明度也會影響其子對象在最終輸出中的外觀。 如果您通過window->set_opacity(1.0);
,那么您的孩子將無法做的任何事情都可以讓您看到壁紙,因為窗口已經擋住了。 但是,如果使用window->set_opacity(0.0)
使其透明,則您將根本看不到任何子級,因為它們不是直接在屏幕上繪制的,而是必須經過父級。
據我所知,從孩子的角度來看,沒有辦法打破這種等級制度。 我可以看到一些非常理論上的可能性,您可以通過提供自己的功能來切入窗口圖形,然后以某種方式根本不繪制自己的像素,而是采用child的繪制功能並將其原樣放置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.