python - 用于在 QTabWidget 中复制选项卡的按钮

标签 python pyqt pyqt5 qtabwidget

我有一个程序,它使用带有多个输入框的输入选项卡供用户填写,当这些输入框填写完毕后,我点击运行,另一个程序将运行输入的数据。我希望我的程序有一个带有加号的选项卡按钮,可以动态复制选项卡,以便我可以运行多个实例。我希望每个选项卡使用相同的名称,但最后有一个变体 - 例如“EntryBox0”、“EntryBox1”、“EntryBox2”。

有没有一种简单的方法可以做到这一点,同时保持所有选项卡中的格式(小部件位置)相同?

我的第一个想法是手动编码多个选项卡,并为每个选项卡设置一个隐藏/取消隐藏按钮,但这会需要更多代码。

enter image description here

我想在“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 类有一个 setCornerWidget可用于向选项卡栏添加按钮的方法。它只能位于选项卡栏的左端或右端(而不是在最后一个选项卡之后) - 但是,对我来说,这似乎更用户友好,因为当新选项卡打开时该按钮不会移动添加。通过为选项卡页创建单独的类,可以轻松复制选项卡本身。

下面是一个实现该功能的简单演示脚本:

screenshot

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_())

关于python - 用于在 QTabWidget 中复制选项卡的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47556122/

相关文章:

python - 'pyuic5' 不被识别为内部或外部命令

python - PyQt5 在 Python 3.5 中调用 matplotlib.pyplot 时出现 "No module named ' PyQt 4'"错误

python - 如何在pyqt5 Python中的行编辑中添加背景文本

python - 当行具有不同顺序的相同值时删除行

python - 使用 Python 发送 HTML 电子邮件

Esky 的 Python 项目结构

python - PyQt4:如何/何时从 QTabWidget 的子类发出自定义信号?

python - 如果 Python 中没有数据传输,如何从标准输入或文件中读取?

python - python中使用Maclaurin系列e ^ x的实现

python - 画半无限线?