加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – PYQT如何编辑在MainWindow中标记的QDockWidget的标题

发布时间:2020-12-20 11:56:03 所属栏目:Python 来源:网络整理
导读:from PyQt4 import QtCore,QtGuiclass Window(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.centralContent = QtGui.QMainWindow() self.setCentralWidget(self.centralContent) self.centralContent.firstTabWidget = Q
from PyQt4 import QtCore,QtGui

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.centralContent = QtGui.QMainWindow()

        self.setCentralWidget(self.centralContent)

        self.centralContent.firstTabWidget = QtGui.QWidget()
        self.centralContent.firstTabDock = QtGui.QDockWidget("first")
        self.centralContent.firstTabDock.setWidget(self.centralContent.firstTabWidget)
        self.centralContent.addDockWidget(QtCore.Qt.LeftDockWidgetArea,self.centralContent.firstTabDock)
        self.centralContent.secondTabWidget = QtGui.QWidget()
        self.centralContent.secondTabDock = QtGui.QDockWidget("second")
        self.centralContent.secondTabDock.setWidget(self.centralContent.secondTabWidget)
        self.centralContent.addDockWidget(QtCore.Qt.LeftDockWidgetArea,self.centralContent.secondTabDock)

        self.centralContent.tabifyDockWidget(self.centralContent.firstTabDock,self.centralContent.secondTabDock)


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    app.exec_()

这是我的示例代码.我想用鼠标双击编辑DockWidget的标题(‘first’,’second’).这个问题有样品或类吗?

解决方法

这是@JosephIreland解决方案的PyQt4端口(有一些改进):

class DockTitleBar(QtGui.QWidget):
    def __init__(self,dockWidget):
        super(DockTitleBar,self).__init__(dockWidget)

        boxLayout = QtGui.QHBoxLayout(self)
        boxLayout.setSpacing(1)
        boxLayout.setMargin(1)

        self.titleLabel = QtGui.QLabel(self)
        self.titleEdit = QtGui.QLineEdit(self)
        self.titleEdit.hide()
        self.titleEdit.editingFinished.connect(self.finishEdit)

        iconSize = QtGui.QApplication.style().standardIcon(
            QtGui.QStyle.SP_TitleBarNormalButton).actualSize(
                QtCore.QSize(100,100))
        buttonSize = iconSize + QtCore.QSize(4,4)

        self.dockButton = QtGui.QToolButton(self)
        self.dockButton.setIcon(QtGui.QApplication.style().standardIcon(
            QtGui.QStyle.SP_TitleBarNormalButton))
        self.dockButton.setMaximumSize(buttonSize)
        self.dockButton.setAutoRaise(True)
        self.dockButton.clicked.connect(self.toggleFloating)

        self.closeButton = QtGui.QToolButton(self)
        self.closeButton.setMaximumSize(buttonSize)
        self.closeButton.setAutoRaise(True)
        self.closeButton.setIcon(QtGui.QApplication.style().standardIcon(
            QtGui.QStyle.SP_DockWidgetCloseButton))
        self.closeButton.clicked.connect(self.closeParent)

        boxLayout.addSpacing(2)
        boxLayout.addWidget(self.titleLabel)
        boxLayout.addWidget(self.titleEdit)
        boxLayout.addStretch()
        boxLayout.addSpacing(5)
        boxLayout.addWidget(self.dockButton)
        boxLayout.addWidget(self.closeButton)

        dockWidget.featuresChanged.connect(self.onFeaturesChanged)

        self.onFeaturesChanged(dockWidget.features())
        self.setTitle(dockWidget.windowTitle())

        dockWidget.installEventFilter(self)

    def eventFilter(self,source,event):
        if event.type() == QtCore.QEvent.WindowTitleChange:
            self.setTitle(source.windowTitle())
        return super(DockTitleBar,self).eventFilter(source,event)

    def startEdit(self):
        self.titleLabel.hide()
        self.titleEdit.show()
        self.titleEdit.setFocus()

    def finishEdit(self):
        self.titleEdit.hide()
        self.titleLabel.show()
        self.parent().setWindowTitle(self.titleEdit.text())

    def onFeaturesChanged(self,features):
        if not features & QtGui.QDockWidget.DockWidgetVerticalTitleBar:
            self.closeButton.setVisible(
                features & QtGui.QDockWidget.DockWidgetClosable)
            self.dockButton.setVisible(
                features & QtGui.QDockWidget.DockWidgetFloatable)
        else:
            raise ValueError('vertical title bar not supported')

    def setTitle(self,title):
        self.titleLabel.setText(title)
        self.titleEdit.setText(title)

    def toggleFloating(self):
        self.parent().setFloating(not self.parent().isFloating())

    def closeParent(self):
        self.parent().toggleViewAction().setChecked(False)
        self.parent().hide()

    def mouseDoubleClickEvent(self,event):
        if event.pos().x() <= self.titleLabel.width():
            self.startEdit()
        else:
            # this keeps the normal double-click behaviour
            super(DockTitleBar,self).mouseDoubleClickEvent(event)

    def mouseReleaseEvent(self,event):
        event.ignore()

    def mousePressEvent(self,event):
        event.ignore()

    def mouseMoveEvent(self,event):
        event.ignore()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读