在QTabBar/QTabWidget中内联重命名选项卡
Inline renaming of a tab in QTabBar/QTabWidget
我真的想有一个QTabWidget,可以通过双击标签标题重命名。我在谷歌上搜索并找到了这个解决方案,但它更像是一个开发人员的大纲,他们知道如何通过Qt和子类化它的小部件。我有点纠结于如何实现这些。我已经使用了一个例子给出进一步的线程(与IndependentLineEdit
等),它的工作,但它不是我想要的。我不想有任何类型的InputDialog。我不想有任何浮动的小部件或东西。我基本上想要的是使用QTabWidget(子类),其行为方式类似于电子表格选项卡在现代办公套件中所做的方式-像,选项卡标签被替换为无缝行编辑,它在Enter上重置选项卡标签或在Esc上留下完整的标签。到目前为止,我还没有找到这样的解决办法。我确实明白,我真正需要的是非常接近这个:
在QTabBar::tabRect()中提供一个临时的QLineEdit,由QTabBar::tabText()填充
但我不明白该怎么做。此外,由于QTabBar是一种裸选项卡,我也希望在QTabWidget(子类)中包含。
以下是PyQt4中Python中此类行为的实现。将其转换为c++应该很容易。请注意,Qt5有一个很好的信号选项卡bardoubleclick,这在Qt4中缺失。这段代码也产生了这样的信号。
from PyQt4 import QtGui
from PyQt4.QtCore import pyqtSignal, pyqtSlot
class 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。这是通过将保证金固定到一定值来实现的。我敢肯定,如果需要的话,可以在样式中查找该值。
相关文章:
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 通过重命名C++中的符号来减小二进制大小
- 如何以与 API 兼容的方式重命名类成员?
- 如何在Visual Studio Code中重命名我的a.exe文件?
- 在Qt中复制,剪切,粘贴,重命名,撤消和重做
- 重命名 win32api 函数以进行混淆
- 将内容从第一个文件("constituencies")移动到第二个文件("temp")并在之后重命名时,我的文件被删除
- 如何在重命名函数 (c++) 中使用变量?
- 如何通过 boost::p ython 重命名构造函数的关键字参数
- 以编程方式防止重命名或删除文件,但仍使其可写
- C++:重命名dll和lib并链接
- 使用 stdio.h 重新定位和重命名文件C++
- C++ Qt5 QDir重命名返回错误
- C++提升 ptree 重命名键
- 如何检测哪些进程更改,重命名或创建文件?
- 禁用/重命名从主机环境导入"env"
- 录制后无法重命名 rosbag 文件
- 避免在统计数据和重命名之间进行TOCTOU(检查时间,使用时间)
- 双击Qt选项卡时重命名
- 在QTabBar/QTabWidget中内联重命名选项卡