2012-01-03 2 views
2

Я могу переименовать ярлык вкладки во внутренней части.PyQt: Редактируемые ярлыки вкладок

С QInputDialog Я могу получить новую метку и установить ярлык виджета вкладки.

Но, я надеюсь, что более удобное для пользователя решение, например, двойное нажатие на ярлык и получение формы редактирования на себе.

A listWidgetItem с редактируемым флагом может показать мне путь, но я не могу найти решение для метки табуляции.

Все, что может помочь мне :)

ответ

6

Там нет встроенных методов для достижения этой цели.

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

Вместо QInputDialog вы можете создать свой собственный упрощенный диалог для редактирования меток. Это может быть просто простой всплывающей линейкой редактирование, без каких-либо кнопок, и нет заголовка, и т.д.

EDIT

Вот скрипт, который демонстрирует основы редактирования вкладки:

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.show() 
    sys.exit(app.exec_()) 
+1

WOW !!!! ВЫ МОЙ СПАСИТЕЛЬ!! Спасибо за вашу доброту. Оно работает! Я вставил ваш скрипт, немного изменил;), и просто сделайте «setTabBar», –

3

Update к ответу оставленной 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_()) 
Смежные вопросы