用于在 QTabWidget 中复制选项卡的按钮
Button for duplicating tabs in a QTabWidget
我有一个程序使用带有多个输入框的输入选项卡供用户填写,当这些输入框被填写后,我点击 运行,另一个程序将 运行输入的数据。我希望我的程序有一个带加号的选项卡按钮,可以动态复制选项卡,这样我就可以 运行 多个实例。我希望每个选项卡都使用相同的名称,但末尾有一个变体 - 例如"EntryBox0", "EntryBox1", "EntryBox2".
有没有一种简单的方法可以做到这一点,同时在所有选项卡中保持格式(小部件位置)相同?
我的第一个想法是手动对多个选项卡进行编码,并为每个选项卡设置一个 hide/unhide 按钮,但是这样会需要更多代码。
我想在 "Tab 2" 旁边添加 + 号。所有选项卡都相同。这些小部件将具有相同的名称,但末尾有一个动态编号以标识正在使用的选项卡。
from Stage import Ui_Form
from Tabs import Ui_TabPage
class TabPage(QWidget, Ui_TabPage):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
class Stage(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
button = QtWidgets.QToolButton()
button.setToolTip('Add New Tab')
button.clicked.connect(self.addNewTab)
button.setIcon(self.style().standardIcon(
QtWidgets.QStyle.SP_DialogYesButton))
self.tabWidget.setCornerWidget(button, QtCore.Qt.TopRightCorner)
self.addNewTab()
def addNewTab(self):
text = 'Tab %d' % (self.tabWidget.count() + 1)
self.tabWidget.addTab(TabPage(self.tabWidget), text)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Stage()
window.setGeometry(600, 100, 300, 200)
window.show()
sys.exit(app.exec_())
QTabWidget
class 有一个 setCornerWidget 方法,可用于向 tab-bar 添加按钮。这只能定位在 tab-bar 的左端或右端(而不是在最后一个选项卡之后)——但是,对我来说,这似乎更 user-friendly,因为按钮不会移动添加了一个新选项卡。通过为标签页创建单独的 class,可以轻松复制标签本身。
下面是实现该功能的简单演示脚本:
import sys
from PyQt5 import QtCore, QtWidgets
class TabPage(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
group = QtWidgets.QGroupBox('Monty Python')
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(group)
grid = QtWidgets.QGridLayout(group)
grid.addWidget(QtWidgets.QLabel('Enter a name:'), 0, 0)
grid.addWidget(QtWidgets.QLabel('Choose a number:'), 0, 1)
grid.addWidget(QtWidgets.QLineEdit(), 1, 0)
grid.addWidget(QtWidgets.QComboBox(), 1, 1)
grid.addWidget(QtWidgets.QPushButton('Click Me!'), 1, 2)
grid.addWidget(QtWidgets.QSpinBox(), 2, 0)
grid.addWidget(QtWidgets.QPushButton('Clear Text'), 2, 2)
grid.addWidget(QtWidgets.QTextEdit(), 3, 0, 1, 3)
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.tabs = QtWidgets.QTabWidget()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.tabs)
button = QtWidgets.QToolButton()
button.setToolTip('Add New Tab')
button.clicked.connect(self.addNewTab)
button.setIcon(self.style().standardIcon(
QtWidgets.QStyle.SP_DialogYesButton))
self.tabs.setCornerWidget(button, QtCore.Qt.TopRightCorner)
self.addNewTab()
def addNewTab(self):
text = 'Tab %d' % (self.tabs.count() + 1)
self.tabs.addTab(TabPage(self.tabs), text)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.setGeometry(600, 100, 300, 200)
window.show()
sys.exit(app.exec_())
我有一个程序使用带有多个输入框的输入选项卡供用户填写,当这些输入框被填写后,我点击 运行,另一个程序将 运行输入的数据。我希望我的程序有一个带加号的选项卡按钮,可以动态复制选项卡,这样我就可以 运行 多个实例。我希望每个选项卡都使用相同的名称,但末尾有一个变体 - 例如"EntryBox0", "EntryBox1", "EntryBox2".
有没有一种简单的方法可以做到这一点,同时在所有选项卡中保持格式(小部件位置)相同?
我的第一个想法是手动对多个选项卡进行编码,并为每个选项卡设置一个 hide/unhide 按钮,但是这样会需要更多代码。
我想在 "Tab 2" 旁边添加 + 号。所有选项卡都相同。这些小部件将具有相同的名称,但末尾有一个动态编号以标识正在使用的选项卡。
from Stage import Ui_Form
from Tabs import Ui_TabPage
class TabPage(QWidget, Ui_TabPage):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
class Stage(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
button = QtWidgets.QToolButton()
button.setToolTip('Add New Tab')
button.clicked.connect(self.addNewTab)
button.setIcon(self.style().standardIcon(
QtWidgets.QStyle.SP_DialogYesButton))
self.tabWidget.setCornerWidget(button, QtCore.Qt.TopRightCorner)
self.addNewTab()
def addNewTab(self):
text = 'Tab %d' % (self.tabWidget.count() + 1)
self.tabWidget.addTab(TabPage(self.tabWidget), text)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Stage()
window.setGeometry(600, 100, 300, 200)
window.show()
sys.exit(app.exec_())
QTabWidget
class 有一个 setCornerWidget 方法,可用于向 tab-bar 添加按钮。这只能定位在 tab-bar 的左端或右端(而不是在最后一个选项卡之后)——但是,对我来说,这似乎更 user-friendly,因为按钮不会移动添加了一个新选项卡。通过为标签页创建单独的 class,可以轻松复制标签本身。
下面是实现该功能的简单演示脚本:
import sys
from PyQt5 import QtCore, QtWidgets
class TabPage(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
group = QtWidgets.QGroupBox('Monty Python')
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(group)
grid = QtWidgets.QGridLayout(group)
grid.addWidget(QtWidgets.QLabel('Enter a name:'), 0, 0)
grid.addWidget(QtWidgets.QLabel('Choose a number:'), 0, 1)
grid.addWidget(QtWidgets.QLineEdit(), 1, 0)
grid.addWidget(QtWidgets.QComboBox(), 1, 1)
grid.addWidget(QtWidgets.QPushButton('Click Me!'), 1, 2)
grid.addWidget(QtWidgets.QSpinBox(), 2, 0)
grid.addWidget(QtWidgets.QPushButton('Clear Text'), 2, 2)
grid.addWidget(QtWidgets.QTextEdit(), 3, 0, 1, 3)
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.tabs = QtWidgets.QTabWidget()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.tabs)
button = QtWidgets.QToolButton()
button.setToolTip('Add New Tab')
button.clicked.connect(self.addNewTab)
button.setIcon(self.style().standardIcon(
QtWidgets.QStyle.SP_DialogYesButton))
self.tabs.setCornerWidget(button, QtCore.Qt.TopRightCorner)
self.addNewTab()
def addNewTab(self):
text = 'Tab %d' % (self.tabs.count() + 1)
self.tabs.addTab(TabPage(self.tabs), text)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.setGeometry(600, 100, 300, 200)
window.show()
sys.exit(app.exec_())