【问题标题】:Show and hide tab widgets dynamically with pySide使用 pySide 动态显示和隐藏选项卡小部件
【发布时间】:2018-03-17 09:26:44
【问题描述】:

如果我在 QT Designer 中创建 UI(并将 UI 导入脚本),如何在脚本中隐藏和显示选项卡?

class Tool(QMainWindow, uiTool.Ui_Tool):
    def __init__(self):
        super(Tool, self).__init__()
        # SETUP UI
        self.setupUi(self)

        # self.tabWidget.removeTab() ???

【问题讨论】:

  • 删除选项卡时,不会删除页面小部件。所以你可以用self.tabWidget.insertTab(index, self.myPage, 'Title')之类的东西把它放回去。您可能应该确保在 Qt Designer 中为每个页面设置一个合理的名称。可以通过self.tabWidget.indexOf(self.myPage)获取页面索引。
  • 谢谢,@ekhumoro!但是代码self.tabWidget.removeTab() 不起作用。那是原来的问题。然后我需要弄清楚如何恢复已删除的标签。而这个上下文中的page是什么,和tab一样吗?
  • 您需要将索引传递给removeTab。在 Qt Designer 中,每当您创建选项卡小部件时,它都会自动创建一些页面小部件。这些将显示在对象检查器中的选项卡小部件下方。如果您单击这些页面小部件,您可以设置 objectName。如果您将其设置为“myPage”,则可以使用self.indexOf(self.myPage) 获取其索引,然后使用self.removeTab(index) 将其删除。
  • @ekhumoro 在 QT 设计器和编译的 python 代码中都找不到任何页面小部件!见QT screen
  • 看我的回答下面的一个简单的演示。这些页面在屏幕截图中显示为tab_Atab_Btab_C(对象检查器窗格,右上角)。因此可以通过self.tab_Aself.tab_B 等方式访问它们。

标签: tabs pyside qt-designer qtabwidget


【解决方案1】:

无法隐藏/显示选项卡小部件中的选项卡,因此您需要删除并替换它们。

以下是演示如何执行此操作的演示脚本。在此示例中,我没有尝试跟踪原始索引 - 它只是显示了所涉及方法的基本用法:

import sys
from PyQt5 import QtCore, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(354, 268)
        self.gridLayout = QtWidgets.QGridLayout(Form)
        self.gridLayout.setObjectName("gridLayout")
        self.tabWidget = QtWidgets.QTabWidget(Form)
        self.tabWidget.setObjectName("tabWidget")
        self.tabRed = QtWidgets.QWidget()
        self.tabRed.setObjectName("tabRed")
        self.tabWidget.addTab(self.tabRed, "")
        self.tabBlue = QtWidgets.QWidget()
        self.tabBlue.setObjectName("tabBlue")
        self.tabWidget.addTab(self.tabBlue, "")
        self.tabGreen = QtWidgets.QWidget()
        self.tabGreen.setObjectName("tabGreen")
        self.tabWidget.addTab(self.tabGreen, "")
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 2)
        self.buttonRemove = QtWidgets.QPushButton(Form)
        self.buttonRemove.setObjectName("buttonRemove")
        self.gridLayout.addWidget(self.buttonRemove, 1, 0, 1, 1)
        self.buttonRestore = QtWidgets.QPushButton(Form)
        self.buttonRestore.setObjectName("buttonRestore")
        self.gridLayout.addWidget(self.buttonRestore, 1, 1, 1, 1)

        self.retranslateUi(Form)
        self.tabWidget.setCurrentIndex(2)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabRed), _translate("Form", "Red"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabBlue), _translate("Form", "Blue"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabGreen), _translate("Form", "Green"))
        self.buttonRemove.setText(_translate("Form", "Remove"))
        self.buttonRestore.setText(_translate("Form", "Restore"))

class Window(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super(Window, self).__init__()
        self.setupUi(self)
        self.buttonRemove.clicked.connect(self.handleButtonRemove)
        self.buttonRestore.clicked.connect(self.handleButtonRestore)
        self.tab_pages = []
        for index in range(self.tabWidget.count()):
            self.tab_pages.append((
                self.tabWidget.widget(index),
                self.tabWidget.tabText(index),
                ))

    def handleButtonRemove(self):
        index = self.tabWidget.currentIndex()
        if index >= 0:
            self.tabWidget.removeTab(index)

    def handleButtonRestore(self):
        for page, title in self.tab_pages:
            if self.tabWidget.indexOf(page) < 0:
                self.tabWidget.addTab(page, title)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 200)
    window.show()
    sys.exit(app.exec_())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2017-08-09
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多