Как иметь прозрачный виджет в непрозрачном окне?

В настоящее время я создаю эмулятор терминала на 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);

изменено все окно, а не только зона виджета …

Я хочу, чтобы это выглядело так:

Вот пример

1

Решение

Я слишком привык делать все через 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 можно увидеть как:

  1. Рисовать *w3 на *grid с непрозрачностью *w3
  2. Рисовать *grid на *box с непрозрачностью *grid
  3. Рисовать *box на *window с непрозрачностью *box
  4. Рисовать *window на экран с непрозрачностью *window

Имейте в виду, что последовательность вызовов функции рисования на самом деле противоположна этому, родитель отвечает за рисование дочернего элемента.

Поэтому непрозрачность каждого объекта также влияет на то, как его дочерние элементы выглядят в конечном результате. если ты window->set_opacity(1.0);, тогда ничто из того, что вы будете делать у детей, не позволит вам увидеть обои, так как окно уже в пути. Но если ты window->set_opacity(0.0) чтобы сделать его прозрачным, вы вообще не увидите дочерних элементов, поскольку они не нарисованы на экране напрямую, а должны пройти через родительский элемент.

Насколько я знаю, нет способа вырваться из этой иерархии с точки зрения ребенка. Я вижу очень теоретическую возможность того, что вы можете вырезать окно рисования, возможно, предоставив свою собственную функцию, и затем каким-то образом вообще не рисовать некоторые собственные пиксели, а взять ту функцию рисования, которую выполняет дочерний элемент, и поместить ее там, как есть.

1

Другие решения


По вопросам рекламы [email protected]