【问题标题】:Hiding a QtMainWindow tab in a GUI?在 GUI 中隐藏 QtMainWindow 选项卡?
【发布时间】:2018-07-16 09:22:52
【问题描述】:

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

主窗口及其选项卡如下所示:

根据我的配置文件中的设置,我想让 TEST 可见,或者对用户隐藏它。我检查了PyQT Docs(即removeDockWidget()?)和两个类似的SO查询(Link Onelink Two),还有一个建议layouts/setVisible的SO问题。

但我做不到。如果我使用.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 选项卡的名称(与 GuiMainWindow..! 中的 testTab 相对)。它附加到一个名为verticalTabWidget 的QTabWidget。因此,以编程方式查找测试选项卡的索引,并将其删除:

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

【问题讨论】:

标签: python qt4 pyqt4


【解决方案1】:

QWidget 等基于close()hide()setVisible(True) 的操作不会影响您的QTabWidget-容器,只会影响包含页面(选项卡)。 由于容器还使用了showhidevisibility-property 的其他访问函数,因此稍后会覆盖您的更改。

您可以通过在另一个选项卡处于活动状态时调用 testTab.show() 来查看此信息。


要对用户隐藏选项卡,您可以:

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

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

只需使用QTabWidget.remove()QTabWidget.insert()QTabWidget.addTab(),如果您需要“隐藏”选项卡中的某些内容,您甚至仍然可以正常访问所有内容。

我在“Tab 2”上添加了一个 QLineEdit,以显示删除时不会丢失任何数据,只需在其中输入一些内容并尝试一下。

【讨论】:

  • 请注意我的示例是用pyqt5 编写的,但它应该完全兼容qith pyqt4 -> 只需切换数字
  • 谢谢,这行得通! - 我只想补充一点,您可以通过编程方式找到要“隐藏”的选项卡的索引。使用QTabWidget.indexOf(testTab),其中testTab 是ui 文件中的QtGui.QWidget。所以在我的(截断的)示例代码中,Ui_MainWindow 是在 ui 文件中定义的类(我从我的帖子中排除)。因此testTab 将是self.ui.testTab
  • 这有点乱,我会在我的原始帖子中添加几行以使事情更清楚。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多