Qt: значок вкладки, когда QDockWidget становится закрепленным

QMainWindow Qt имеет возможность закреплять окна, производные от QDockWidget. Это также поместит одно поверх другого, если несколько из них сложены, создавая панель вкладок. Всякий раз, когда состояние QDockWidget изменяется, выдается сигнал topLevelChanged(). На данный момент я хотел бы получить доступ к базовому QTabWidget, чтобы установить значок для недавно добавленной вкладки. Как мне это сделать? Мое терпение закончилось, когда я пытался найти ответ в документации и исходном коде Qt. Заранее спасибо.

введите здесь описание изображения

Итак, значок, который я хочу разместить на вкладках «Содержание/Указатель».


person def    schedule 06.10.2017    source источник
comment
очень трудно визуализировать. Не могли бы вы опубликовать какой-нибудь пользовательский интерфейс   -  person Pavan Chandaka    schedule 06.10.2017
comment
qTabWidget-›setStyleSheet(QTabBar::tab,QTabBar::tab:selected {фоновое изображение: url(:path);});   -  person Vahagn Avagyan    schedule 07.10.2017
comment
qTabвиджет ? Сначала надо как-то достать...   -  person def    schedule 07.10.2017


Ответы (1)


После того, как хотя бы один док-виджет будет вложен, в главном окне будет создано QTabBar для предоставления док-вкладок. Каждая док-область может иметь свою собственную панель вкладок. Эти панели вкладок станут дочерними элементами главного окна, поэтому вы можете использовать findChildren( ) или children(), чтобы получить ссылки на них.

Основная трудность будет заключаться в том, чтобы найти, какой док-виджет относится к какой вкладке и к какой панели вкладок. Если все заголовки окон док-виджета уникальны, вы можете просто выполнить поиск с помощью tabText (). В противном случае вы можете использовать tabData(), который Qt внутренне устанавливает quintptr из док-виджета.

Если у вас есть правильная вкладка, вы, конечно, можете использовать setTabIcon(). чтобы добавить свой значок. Но обратите внимание, что каждый раз, когда док-виджет распаковывается или перемещается на другую панель вкладок, значок будет потерян.

person ekhumoro    schedule 07.10.2017
comment
Это сработало, но есть еще одна косметическая проблема. Если есть один прикрепленный виджет, и я перетащу на него другой (но еще не сбросил), анимация Qt вступит в силу, и в этот момент будет создана панель вкладок (с одной вкладкой). И на одной вкладке нет значка. Когда я бросаю, только вторая вкладка получает значок. Возможно, сигнал topLevelChanged() для этого не годится. Было бы неплохо подцепить процедуру создания панели вкладок - person def; 07.10.2017
comment
@деф. Возможно, вы могли бы переопределить главное окно event() и следить за дочерними событиями, чтобы увидеть, когда добавлены панели вкладок. - person ekhumoro; 07.10.2017
comment
Не проблема, я просто просматриваю все панели вкладок во время инициализации и каждый раз, когда меняется макет стыковки. - person def; 08.10.2017
comment
@деф. Так теперь все работает? Если это так, я был бы признателен, если бы вы приняли мой ответ (при условии, что вы нашли его полезным). - person ekhumoro; 08.10.2017