В настоящее время я создаю эмулятор терминала на C ++ с помощью libgtkmm и libvte.
Моя цель — иметь прозрачный виджет терминала и непрозрачное окно в другом месте; но я не смог найти ничего о прозрачности виджета.
Я старался
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
на *grid
с непрозрачностью *w3
*grid
на *box
с непрозрачностью *grid
*box
на *window
с непрозрачностью *box
*window
на экран с непрозрачностью *window
Имейте в виду, что последовательность вызовов функции рисования на самом деле противоположна этому, родитель отвечает за рисование дочернего элемента.
Поэтому непрозрачность каждого объекта также влияет на то, как его дочерние элементы выглядят в конечном результате. если ты window->set_opacity(1.0);
, тогда ничто из того, что вы будете делать у детей, не позволит вам увидеть обои, так как окно уже в пути. Но если ты window->set_opacity(0.0)
чтобы сделать его прозрачным, вы вообще не увидите дочерних элементов, поскольку они не нарисованы на экране напрямую, а должны пройти через родительский элемент.
Насколько я знаю, нет способа вырваться из этой иерархии с точки зрения ребенка. Я вижу очень теоретическую возможность того, что вы можете вырезать окно рисования, возможно, предоставив свою собственную функцию, и затем каким-то образом вообще не рисовать некоторые собственные пиксели, а взять ту функцию рисования, которую выполняет дочерний элемент, и поместить ее там, как есть.