【问题标题】:Button for duplicating tabs in a QTabWidget用于在 QTabWidget 中复制选项卡的按钮
【发布时间】:2018-05-13 08:37:10
【问题描述】:

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

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

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

我想在“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_())

【问题讨论】:

    标签: python pyqt pyqt5 qtabwidget


    【解决方案1】:

    QTabWidget 类有一个setCornerWidget 方法,可用于向标签栏添加按钮。这只能位于标签栏的左端或右端(而不是在最后一个标签之后) - 但是,对我来说,这似乎更用户友好,因为当新标签出现时按钮不会移动添加。通过为标签页创建一个单独的类,可以轻松地复制标签本身。

    下面是一个简单的演示脚本,它实现了:

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

    【讨论】:

    • 这就是我要找的东西,我的另一个问题是,我已经使用 QtDesigner 使用布局和滚动区域制作了我的选项卡,有没有办法直接将它导入选项卡类?换句话说,我不想为我拥有的每个标签/行编辑添加 .addwidget?
    • @dre。我假设您将所有小部件添加到 Qt 设计器中选项卡小部件内的页面中。如果是这样,您需要将所有这些小部件移动到新的标签页小部件中并单独保存。一个简单的方法是选择对象检查器中的选项卡,然后按住 shift 键并单击该选项卡下的最后一个子小部件。然后,您可以将小部件作为一个组拖放到新表单上并在其上设置布局。应从选项卡小部件中删除所有旧选项卡。然后你可以使用 pyuic 为标签页类生成一个模块,可以像主 gui 类一样导入。
    • 我已经用您提供的代码更新了我的帖子,我正在尝试按照您所说的进行操作。我已将所有选项卡复制到 QtDesigner 中的新表单并保存为 UI 并使用 pyuic 生成模块,我没有得到任何东西,我显然做错了什么,可能导入不正确。
    • @dre。您应该有两种不同的形式:一种用于主 gui(将是 QMainWindow),另一种用于标签页(将是 QWidget)。这些都需要使用 pyuic 重新生成,因此您可以导入它们包含的两个 gui 类。
    • @dre。像例如self.tabWidget.widget(index).lineEdit.text().
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2015-05-21
    • 2018-05-22
    相关资源
    最近更新 更多