PyQt4: проблема с созданием собственного док-станции TitleBarWidget

Я надеялся, что кто-нибудь поможет мне создать собственный виджет строки заголовка для виджета док-станции в программе с графическим интерфейсом PyQt4. Все, что я хочу сделать, это эмулировать точно такой же внешний вид и функцию строки заголовка по умолчанию, но с дополнительной пользовательской кнопкой. Я не смог найти простой способ сделать это, так как не знаю, есть ли виджет строки заголовка по умолчанию, в который я могу добавить что-то, поэтому я сделал собственный виджет строки заголовка док-станции:

from PyQt4 import QtGui, QtCore


class DockTitleBar(QtGui.QFrame):
    def __init__(self, parent):
        super(DockTitleBar, self).__init__(parent)

        # Is this the only way to give the title bar a border?
        self.setFrameStyle(QtGui.QFrame.Raised | QtGui.QFrame.StyledPanel)

        # Layout for title box
        layout = QtGui.QHBoxLayout(self)
        layout.setSpacing(1)
        layout.setMargin(1)

        self.label = QtGui.QLabel(parent.windowTitle())

        icon_size = QtGui.QApplication.style().standardIcon(
            QtGui.QStyle.SP_TitleBarNormalButton).actualSize(
                QtCore.QSize(100, 100))
        button_size = icon_size + QtCore.QSize(5, 5)

        # Custom button I want to add
        self.button = QtGui.QToolButton(self)
        self.button.setAutoRaise(True)
        self.button.setMaximumSize(button_size)
        self.button.setIcon(QtGui.QApplication.style().standardIcon(
            QtGui.QStyle.SP_TitleBarContextHelpButton))
        self.button.clicked.connect(self.do_something)

        # Close dock button
        self.close_button = QtGui.QToolButton(self)
        self.close_button.setAutoRaise(True)
        self.close_button.setMaximumSize(button_size)
        self.close_button.setIcon(QtGui.QApplication.style().standardIcon(
            QtGui.QStyle.SP_DockWidgetCloseButton))
        self.close_button.clicked.connect(self.close_parent)

        # Setup layout
        layout.addWidget(self.label)
        layout.addStretch()
        layout.addWidget(self.button)
        layout.addWidget(self.close_button)

    def do_something(self):
        # Do something when custom button is pressed
        pass

    def close_parent(self):
        self.parent().hide()

Кажется, все работает нормально, за исключением случаев, когда док-станция перетаскивается в плавающем состоянии. Обычно есть границы и даже строка заголовка подсвечивается, но в моей дерьмовой версии нет рамки для плавучего дока, поэтому трудно сказать, где он находится, и строка заголовка не подсвечивается. Могу ли я что-то исправить/добавить или я должен делать это совершенно по-другому?


person teapout    schedule 26.05.2017    source источник
comment
пожалуйста, проверьте здесь stackoverflow.com/ вопросы/9377914/   -  person Achayan    schedule 27.05.2017
comment
Согласно документам: если установлен виджет строки заголовка, QDockWidget не будет использовать собственные украшения окна, когда оно плавает. Невозможно получить доступ к виджету строки заголовка по умолчанию. Так что похоже придется все реализовывать самому.   -  person ekhumoro    schedule 27.05.2017