Как отобразить подсказки о состоянии в главном окне незакрепленного виджета в доке?

Я хотел бы иметь возможность использовать QWidget.setStatusTip(str) для виджетов внутри прикрепленного виджета, когда виджет док-станции отстыкован. Это не работает по умолчанию.

Теоретически я мог бы вручную управлять строкой состояния вручную, но это кажется очень плохим способом решения этой проблемы.

Пример подсказки состояния, работающей правильно, когда QDockWidget пристыкован:

Как отобразить подсказки о состоянии в главном окне незакрепленного виджета в доке?

Пример подсказки состояния, которая не работает должным образом, когда QDockWidget отстыкован (обратите внимание, что я наводил курсор на то же поле, единственная разница в том, что виджет плавает):

Как отобразить подсказки о состоянии в главном окне незакрепленного виджета в доке?

Я попытался установить родителем виджета док-станции QMainWindow.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подсказка состояния работает, вызывая событие 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() (как и должно быть), он в любом случае автоматически переопределяется (в противном случае вы не сможете увидеть его встроенным в области док-станции).

Большое спасибо! Это очень полезно. Я думаю, что на самом деле он настроит фильтры событий автоматически, изменив addDockWidget.

Wolf 24.11.2022 01:44

@Wolf, это может быть хорошей идеей, просто учтите, что для этой функции есть две перегрузки, и вы должны быть осторожны с аргументами. Обратите внимание: если ответ решает вашу проблему, вы должны пометить его как принятый, щелкнув значок серой галочки слева от него.

musicamante 24.11.2022 07:27

Другие вопросы по теме