Я действительно хочу иметь QTabWidget, который можно переименовать, дважды щелкнув заголовок вкладки.
Я гуглил и нашел это решение, но это больше похоже на набросок для разработчика, который знает, как пройти через Qt и подклассифицировать свои виджеты.
Я как бы застрял, как реализовать все это. Я использовал пример, приведенный ниже по этой теме (с IndependentLineEdit
и так далее) и это сработало, но это не то, что я хотел.
Я не хочу иметь какой-либо InputDialog. Я не хочу иметь плавающий виджет или что-то.
То, что я в основном хочу, это использовать QTabWidget (подкласс), который ведет себя так же, как вкладки электронных таблиц в современных офисных пакетах — например, метка вкладки заменяется бесшовным редактированием строки, которая сбрасывает метку вкладки на Enter или оставляет ее нетронутой на Esc.
Я не смог найти такое решение до сих пор. Я понимаю, что то, что мне действительно нужно, очень близко к этому:
предоставить временный QLineEdit в QTabBar :: tabRect (), заполненный QTabBar :: tabText ()
но я не понимаю, как это сделать. Более того, поскольку QTabBar является своего рода пустой панелью вкладок, я также предпочел бы, чтобы она была заключена в QTabWidget (подкласс).
Ниже приведена реализация такого поведения в Python в PyQt4. Должно быть легко преобразовать это в C ++. Обратите внимание, что Qt5 имеет хороший сигнал tabBarDoubleClicked чего нет в Qt4. Этот фрагмент кода также создает такой сигнал.
from PyQt4 import QtGui
from PyQt4.QtCore import pyqtSignal, pyqtSlotclass QTabBar(QtGui.QTabBar):
"""QTabBar with double click signal and tab rename behavior."""
def __init__(self, parent=None):
super().__init__(parent)
tabDoubleClicked = pyqtSignal(int)
def mouseDoubleClickEvent(self, event):
tab_index = self.tabAt(event.pos())
self.tabDoubleClicked.emit(tab_index)
self.start_rename(tab_index)
def start_rename(self, tab_index):
self.__edited_tab = tab_index
rect = self.tabRect(tab_index)
top_margin = 3
left_margin = 6
self.__edit = QtGui.QLineEdit(self)
self.__edit.show()
self.__edit.move(rect.left() + left_margin, rect.top() + top_margin)
self.__edit.resize(rect.width() - 2 * left_margin, rect.height() - 2 * top_margin)
self.__edit.setText(self.tabText(tab_index))
self.__edit.selectAll()
self.__edit.setFocus()
self.__edit.editingFinished.connect(self.finish_rename)
@pyqtSlot()
def finish_rename(self):
self.setTabText(self.__edited_tab, self.__edit.text())
self.__edit.deleteLater()class QTabWidget(QtGui.QTabWidget):
"""QTabWidget with double click on tab signal and tab rename behavior."""
def __init__(self, parent):
super().__init__(parent)
self.setTabBar(QTabBar())
self.tabBar().tabDoubleClicked.connect(self.tabBarDoubleClicked)
tabBarDoubleClicked = pyqtSignal(int)
Обратите внимание, что есть довольно хакерское решение для выравнивания qlineedit в заголовке вкладки. Это достигается путем фиксирования маржи до определенного значения. Я уверен, что при необходимости можно найти это значение в стиле.