Я хотел бы иметь возможность использовать QWidget.setStatusTip(str) для виджетов внутри прикрепленного виджета, когда виджет док-станции отстыкован. Это не работает по умолчанию.
Теоретически я мог бы вручную управлять строкой состояния вручную, но это кажется очень плохим способом решения этой проблемы.
Пример подсказки состояния, работающей правильно, когда QDockWidget пристыкован:
Пример подсказки состояния, которая не работает должным образом, когда QDockWidget отстыкован (обратите внимание, что я наводил курсор на то же поле, единственная разница в том, что виджет плавает):
Я попытался установить родителем виджета док-станции QMainWindow.
Подсказка состояния работает, вызывая событие StatusTip
в виджете, если он его не обрабатывает, он распространяется на его родительскую иерархию до тех пор, пока какой-либо из них не обработает его (и его event()
вернет True
).
Подсказка состояния обычно управляется главным окном верхнего уровня, которое содержит виджет, запускающий событие. Когда виджет док-станции является плавающим, это собственное окно верхнего уровня, поэтому главное окно не получит его.
Возможное решение — установить фильтр событий на виджет док-станции, проверить, имеет ли событие правильный тип, проверить, действительно ли док-станция плавает, а затем «перенаправить» событие в event()
главного окна и вернуть его результат.
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.setCentralWidget(QTextEdit())
self.dockWidget = QDockWidget()
container = QWidget()
self.dockWidget.setWidget(container)
self.button = QPushButton(
'I am a button',
toolTip='I am a tool tip',
statusTip='I am a status tip'
)
QVBoxLayout(container).addWidget(self.button)
self.addDockWidget(Qt.LeftDockWidgetArea, self.dockWidget)
self.statusBar()
self.dockWidget.installEventFilter(self)
def eventFilter(self, obj, event):
if (
event.type() == event.StatusTip
and obj == self.dockWidget
and self.dockWidget.isFloating()
):
return self.event(event)
return super().eventFilter(obj, event)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
Примечание: установка родителя QDockWidget в главное окно бессмысленна: когда он правильно добавлен с помощью addDockWidget()
(как и должно быть), он в любом случае автоматически переопределяется (в противном случае вы не сможете увидеть его встроенным в области док-станции).
@Wolf, это может быть хорошей идеей, просто учтите, что для этой функции есть две перегрузки, и вы должны быть осторожны с аргументами. Обратите внимание: если ответ решает вашу проблему, вы должны пометить его как принятый, щелкнув значок серой галочки слева от него.
Большое спасибо! Это очень полезно. Я думаю, что на самом деле он настроит фильтры событий автоматически, изменив addDockWidget.