Я слишком привык делать все через Поляну. Поэтому я начну с этого. У меня не было никаких проблем, что делает любой виджет прозрачным со свойством «непрозрачности»:
<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 можно рассматривать как:
- Draw
*w3
на *grid
с непрозрачностью *w3
- Draw
*grid
на *box
с непрозрачностью *grid
- Draw
*box
на *window
с непрозрачностью *box
- Draw
*window
на экране с непрозрачностью *window
Имейте в виду, что последовательность вызовов функции рисования на самом деле противоположна этому, родитель несет ответственность за рисование дочернего элемента.
Поэтому непрозрачность каждого объекта также влияет на то, как его дети выглядят в конечном выходе. Если вы window->set_opacity(1.0);
, то ничего, что вы сделаете в детях, позволит вам увидеть обои, так как окно уже в пути. Но если вы используете window->set_opacity(0.0)
, чтобы сделать его прозрачным, вы вообще не увидите никаких детей, так как они не нарисованы на экране напрямую, а должны пройти через родителя.
Насколько я знаю, нет способа выйти из этой иерархии с точки зрения ребенка. Я вижу очень теоретическую возможность, что вы можете нарезать рисунок окна, возможно, предоставив свою собственную функцию, а затем каким-то образом не нарисуйте некоторые из собственных пикселей, но возьмите, что делает функция рисования ребенка, и поместите его туда, где есть.
Вы когда-нибудь находили ответ для этого? Я пытаюсь сделать что-то подобное. – Debianita