【问题标题】:PyQt: Editable QTabWidget tab textPyQt:可编辑的 QTabWidget 选项卡文本
【发布时间】:2012-01-03 02:59:47
【问题描述】:

我可以通过编程重命名标签标签。

使用QInputDialog,我可以获得新的标签文本并设置标签小部件标签。

但是,我希望有一个更加用户友好的解决方案,例如双击标签并在标签本身上进行编辑。

带有可编辑标志的QListWidgetItem 可以为我指明方向,但我找不到标签标签的解决方案。

【问题讨论】:

    标签: python pyqt pyqt4 qtabwidget


    【解决方案1】:

    没有实现此目的的内置方法。但是,您可以使用简单的弹出行编辑并将其放置在选项卡上。这是一个基本的演示脚本:

    PyQt5:

    import sys
    from PyQt5 import QtCore, QtWidgets
    
    class TabBar(QtWidgets.QTabBar):
        def __init__(self, parent):
            super().__init__(parent)
            self._editor = QtWidgets.QLineEdit(self)
            self._editor.setWindowFlags(QtCore.Qt.Popup)
            self._editor.setFocusProxy(self)
            self._editor.editingFinished.connect(self.handleEditingFinished)
            self._editor.installEventFilter(self)
    
        def eventFilter(self, widget, event):
            if ((event.type() == QtCore.QEvent.MouseButtonPress and
                 not self._editor.geometry().contains(event.globalPos())) or
                (event.type() == QtCore.QEvent.KeyPress and
                 event.key() == QtCore.Qt.Key_Escape)):
                self._editor.hide()
                return True
            return super().eventFilter(widget, event)
    
        def mouseDoubleClickEvent(self, event):
            index = self.tabAt(event.pos())
            if index >= 0:
                self.editTab(index)
    
        def editTab(self, index):
            rect = self.tabRect(index)
            self._editor.setFixedSize(rect.size())
            self._editor.move(self.parent().mapToGlobal(rect.topLeft()))
            self._editor.setText(self.tabText(index))
            if not self._editor.isVisible():
                self._editor.show()
    
        def handleEditingFinished(self):
            index = self.currentIndex()
            if index >= 0:
                self._editor.hide()
                self.setTabText(index, self._editor.text())
    
    class Window(QtWidgets.QTabWidget):
        def __init__(self):
            super().__init__()
            self.setTabBar(TabBar(self))
            self.addTab(QtWidgets.QWidget(self), 'Tab One')
            self.addTab(QtWidgets.QWidget(self), 'Tab Two')
    
    if __name__ == '__main__':
    
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.setWindowTitle('Test')
        window.setGeometry(600, 100, 200, 100)
        window.show()
        sys.exit(app.exec_())
    

    PyQt4:

    from PyQt4 import QtGui, QtCore
    
    class TabBar(QtGui.QTabBar):
        def __init__(self, parent):
            QtGui.QTabBar.__init__(self, parent)
            self._editor = QtGui.QLineEdit(self)
            self._editor.setWindowFlags(QtCore.Qt.Popup)
            self._editor.setFocusProxy(self)
            self._editor.editingFinished.connect(self.handleEditingFinished)
            self._editor.installEventFilter(self)
    
        def eventFilter(self, widget, event):
            if ((event.type() == QtCore.QEvent.MouseButtonPress and
                 not self._editor.geometry().contains(event.globalPos())) or
                (event.type() == QtCore.QEvent.KeyPress and
                 event.key() == QtCore.Qt.Key_Escape)):
                self._editor.hide()
                return True
            return QtGui.QTabBar.eventFilter(self, widget, event)
    
        def mouseDoubleClickEvent(self, event):
            index = self.tabAt(event.pos())
            if index >= 0:
                self.editTab(index)
    
        def editTab(self, index):
            rect = self.tabRect(index)
            self._editor.setFixedSize(rect.size())
            self._editor.move(self.parent().mapToGlobal(rect.topLeft()))
            self._editor.setText(self.tabText(index))
            if not self._editor.isVisible():
                self._editor.show()
    
        def handleEditingFinished(self):
            index = self.currentIndex()
            if index >= 0:
                self._editor.hide()
                self.setTabText(index, self._editor.text())
    
    class Window(QtGui.QTabWidget):
        def __init__(self):
            QtGui.QTabWidget.__init__(self)
            self.setTabBar(TabBar(self))
            self.addTab(QtGui.QWidget(self), 'Tab One')
            self.addTab(QtGui.QWidget(self), 'Tab Two')
    
    if __name__ == '__main__':
    
        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.setWindowTitle('Test')
        window.setGeometry(600, 100, 200, 100)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 哇!!!!你是我的救世主!!谢谢你的好意。有用!我粘贴了您的脚本,稍作编辑;),然后执行“setTabBar”
    • 优秀的解决方案!
    【解决方案2】:

    更新 ekhumoro 留下的答案:

    在 PyQt5 中,代码现在如下所示:

    from PyQt5.QtCore import Qt, QEvent
    from PyQt5.QtWidgets import QTabBar, QTabWidget, QApplication, QLineEdit, QWidget
    
    class EditableTabBar(QTabBar):
        def __init__(self, parent):
            QTabBar.__init__(self, parent)
            self._editor = QLineEdit(self)
            self._editor.setWindowFlags(Qt.Popup)
            self._editor.setFocusProxy(self)
            self._editor.editingFinished.connect(self.handleEditingFinished)
            self._editor.installEventFilter(self)
    
        def eventFilter(self, widget, event):
            if ((event.type() == QEvent.MouseButtonPress and not self._editor.geometry().contains(event.globalPos())) or (event.type() == QEvent.KeyPress and event.key() == Qt.Key_Escape)):
                self._editor.hide()
                return True
            return QTabBar.eventFilter(self, widget, event)
    
        def mouseDoubleClickEvent(self, event):
            index = self.tabAt(event.pos())
            if index >= 0:
                self.editTab(index)
    
        def editTab(self, index):
            rect = self.tabRect(index)
            self._editor.setFixedSize(rect.size())
            self._editor.move(self.parent().mapToGlobal(rect.topLeft()))
            self._editor.setText(self.tabText(index))
            if not self._editor.isVisible():
                self._editor.show()
    
        def handleEditingFinished(self):
            index = self.currentIndex()
            if index >= 0:
                self._editor.hide()
                self.setTabText(index, self._editor.text())
    
    class Window(QTabWidget):
        def __init__(self):
            QTabWidget.__init__(self)
            self.setTabBar(EditableTabBar(self))
            self.addTab(QWidget(self), 'Tab One')
            self.addTab(QWidget(self), 'Tab Two')
    
    if __name__ == '__main__':
    
        import sys
        app = QApplication(sys.argv)
        window = Window()
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2015-06-16
      • 1970-01-01
      相关资源
      最近更新 更多