在GUI中隐藏QtMainWindow选项卡?

时间:2018-02-06 10:35:11

标签: python qt4 pyqt4

我有一个GUI(用PyQt编写),有三个选项卡,每个选项卡都是QtGui.QMainWindow类。整个GUI由.ui文件定义。这似乎是人们希望隐藏QMainWindow对象的SO上的类似问题(下一段中的链接)之间的主要区别。更具体地说,我试图隐藏一个(不是整个)Gui元素的QMainWindow对象。

主窗口及其标签如下所示:

enter image description here

根据配置文件中的设置,我想让TEST可见,或者将其隐藏起来。我已经检查了PyQT Docs(即removeDockWidget()?),并且有两个类似的SO查询(Link Onelink Two),以及一个SO问题建议{{ 3}} ..

但我无法做到。如果我使用.hide().setVisible(False),则似乎没有任何变化。如果我设置.setVisible(True),那么启动时会出现一个额外的微型窗口,其中包含我的主要类的名称。

我的代码结构是:

我的录入/主要课程:

class Gui:
    def __init__(self):
        # Create the main window GUI and show it
        self.mainWindow= GuiMainWindow(self)
        self.mainWindow.show()
    <...>        

def main():
    app = QtGui.QApplication(sys.argv)  
    myGui = Gui(app)
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

GuiMainWindow包含三个标签:

class GuiMainWindow(QtGui.QMainWindow):
    def __init__(self, appMain):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Create helper objects to manage main window tabs
        self.daqTab = GuiMainDaqTab(appMain, self)
        self.pwrTab = GuiMainPowerTab(appMain, self)
        self.testTab = GuiMainTestTab(appMain, self)

        self.testTab.hideMe()

最后,TEST选项卡是我想要隐藏/显示的内容:

class GuiMainTestTab(QtGui.QMainWindow):
    def __init__(self, appMain, mainWindow):
        super(GuiMainTestTab, self).__init__()
        self.appMain = appMain
        self.mainWindow = mainWindow
        self.ui = mainWindow.ui
        <...>

    def hideMe(self):  
        self.close()
    #   self.hide()             # Also tried hide()
    #   self.setVisible(False)  # ..Or setVisible()

---编辑以协助答案/我的匹配评论在下面回答---

因此,类GuiMainTestTab通过其成员self.ui访问ui文件的内容。通过ui文件挖掘,我发现testTab是ui文件中Test标签的名称(而不是testTab中的GuiMainWindow ..!)。它附加到名为verticalTabWidget的QTabWidget。因此,以编程方式查找“测试”选项卡的索引,并将其删除:

        testIdx = self.ui.verticalTabWidget.indexOf(self.ui.testTab)
        self.ui.verticalTabWidget.removeTab(testIdx)

1 个答案:

答案 0 :(得分:1)

基于close()的{​​{1}},hide()setVisible(True)等操作不会影响您的QWidget - 容器,只影响包含页面(标签)。 由于showhideQTabWidget的其他访问功能也被容器使用,因此您的更改将在以后被覆盖。

当其他标签处于有效状态时,您可以通过调用testTab.show()来查看此内容。

要隐藏用户的标签,您可以:

  • 根本不在开始时创建/添加他(修改你的setupUi() - 功能)
  • 使用以下命令从Container(visibility-property)中删除标签: QTabWidget

这是使用第二种方法的最小工作示例:

def main ( ) :
    from PyQt5.QtWidgets import QApplication
    app = QApplication( [] )
    window = Test_Dialog()
    window.show()
    exit( app.exec() )

class Ui_Dialog( object ) :
    def setupUi ( self, Dialog ) :
        from PyQt5 import QtCore, QtWidgets
        self.tabWidget = QtWidgets.QTabWidget( Dialog )
        self.tabWidget.setGeometry( QtCore.QRect( 9, 9, 181, 121 ) )
        self.tab = QtWidgets.QWidget()
        self.pushButton_remove = QtWidgets.QPushButton( "remove", self.tab )
        self.pushButton_remove.setGeometry( QtCore.QRect( 20, 10, 75, 23 ) )
        self.pushButton_add = QtWidgets.QPushButton( "add", self.tab )
        self.pushButton_add.setGeometry( QtCore.QRect( 20, 60, 75, 23 ) )
        self.tabWidget.addTab( self.tab, "Tab 1" )
        self.tab_2 = QtWidgets.QWidget()
        self.lineEdit = QtWidgets.QLineEdit( self.tab_2 )
        self.lineEdit.setGeometry( QtCore.QRect( 30, 30, 113, 20 ) )
        self.tabWidget.addTab( self.tab_2, "Tab 2" )  # remove this for approach #1

from PyQt5.QtWidgets import QDialog
class Test_Dialog( QDialog, Ui_Dialog ) :
    def __init__ ( self ) :
        QDialog.__init__( self )
        self.setupUi( self )
        self.pushButton_remove.clicked.connect( self.hideTab )
        self.pushButton_add.clicked.connect( self.showTab )
    def hideTab ( self ) :
        self.save = self.tabWidget.widget( 1 )  # save it for later
        self.tabWidget.removeTab( 1 )
    def showTab ( self ) :
        self.tabWidget.insertTab( 1, self.save, 'Tab2 is here again' ) # restore

只需使用tabWidget.removeTab(index)QTabWidget.remove()QTabWidget.insert(),您甚至可以正常访问一切,如果您需要来自&#34;隐藏&#34;标签

我在&#34;标签2&#34;上添加了QLineEdit。为了表明在删除时没有数据丢失,只需在那里输入内容并尝试它。