我目前正在使用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>
这样,所有 child 都变得透明,这是有道理的。
然后,我尝试使用
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
的不透明度将*grid
绘制到*w3
上*grid
不透明的方式将*box
绘制到*grid
上*box
的不透明度将*window
绘制到*box
上*window
的不透明度将*window
绘制到屏幕上请记住,绘制函数的调用顺序实际上与此相反,父级负责绘制子级。
因此,每个对象的不透明度也会影响其子对象在最终输出中的外观。如果您使用
window->set_opacity(1.0);
,那么您将不会在 child 中看到壁纸,因为窗口已经在路上。但是,如果使用window->set_opacity(0.0)
使其透明,则根本不会看到任何子级,因为它们不是直接在屏幕上绘制的,而是必须经过父级。据我所知,从 child 的角度来看,没有办法打破这种等级制度。我可以看到一些非常理论上的可能性,您可以通过提供自己的功能来切入窗口图形,然后以某种方式根本不绘制自己的像素,而是采用child的绘制功能并将其原样放置。
关于c++ - 如何在非透明窗口中具有透明小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31624524/