Настройка пользовательского виджета строки заголовка изменяет флаги Windows в Windows

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

Кажется, проблема в том, что только в Windows меняются флаги окна. т.е. когда я делаю это:

   print dock_window.windowFlags()
   dock_window.setTitleBarWidget(title_bar)
   print dock_window.windowFlags()

он выводит разные настройки флагов до и после. Однако в Linux он остается прежним, и границы остаются неизменными.

У меня вопрос, как восстановить границу окна?

ОБНОВЛЕНИЕ: поскольку настраиваемая строка заголовка переопределяет флаги границы, когда окно док-станции плавает, как я могу отредактировать окно док-станции, чтобы оно имело какую-то границу? (Крайне важно, чтобы окно док-станции имело настраиваемую строку заголовка при плавании.)


person vonPetrushev    schedule 13.02.2015    source источник


Ответы (2)


Согласно этому ответу, это ожидаемое поведение.

Из документации setTitleBarWidget:

Если установлен виджет строки заголовка, QDockWidget не будет использовать собственные декорации окна, когда он плавает.

Значит, Linux делает это неправильно?

В любом случае, в качестве обходного пути для Windows я реализовал идею (отключение виджета строки заголовка перед плаванием) из ответа в PySide/PyQt.

from PySide import QtGui, QtCore

class MyDockWidget(QtGui.QDockWidget):

    def __init__(self, title_widget):
        super().__init__()
        self.title_widget = title_widget
        self.toggle_title_widget(False)
        self.topLevelChanged.connect(self.toggle_title_widget)

    def toggle_title_widget(self, off):
        if off:
            self.setTitleBarWidget(None)
        else:
            self.setTitleBarWidget(self.title_widget)


app = QtGui.QApplication([])

w = QtGui.QMainWindow()
t = QtGui.QLabel('Title')
d = MyDockWidget(t)
w.addDockWidget(QtCore.Qt.LeftDockWidgetArea, d)
w.show()

app.exec_()

По крайней мере, он сохраняет стандартное оформление при плавании.

person Trilarion    schedule 13.02.2015
comment
Я добавил обновление к своему исходному вопросу. Крайне важно, чтобы у меня была настраиваемая строка заголовка, когда окно плавает. - person vonPetrushev; 15.02.2015
comment
Вы нашли решение? - person Julien M; 11.07.2018

Я обнаружил, что это неустраненная ошибка в QT, и я не вижу в этом ожидаемое поведение. Я обнаружил несколько случаев, когда люди сталкивались с этой проблемой eg1, eg2 и другие.

  • Некоторые рекомендуют отключить и установить setTitleBarWidget, как в ответе Трилариона. Это, однако, удаляет пользовательскую строку заголовка, и меня это не устраивало.
  • другие рекомендуют устанавливать флаги для события topLevelChanged: window.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);. это добавляет обычную строку заголовка к виджету док-станции, что опять же не то, что я лично хочу.
  • лучшее решение, которое я нашел это w->setWindowFlags(Qt::Tool|Qt::CustomizeWindowHint);. Это использует Qt.CustomizeWindowHint вместо Qt.FramelessWindowHint и не создает огромную строку заголовка, а просто маленькую полосу.

Выполнение

from PyQt5.QtCore import Qt
....
def dockfloatevent(isfloating):
    if isfloating:
        dock.setWindowFlags(Qt.Tool | Qt.CustomizeWindowHint)
dock.topLevelChanged.connect(dockfloatevent)

Я не использую самую последнюю версию Qt, но, насколько я могу судить, это все еще проблема? Если у кого-то есть учетная запись Qt, возможно, опубликуйте что-нибудь по приведенной выше ссылке на ошибку? Я уже потратил много часов на это и не хочу продвигать дальше :|

person Mecgrad    schedule 05.02.2020