在 GUI 中隐藏 QtMainWindow 选项卡?
Hiding a QtMainWindow tab in a GUI?
我有一个带有三个选项卡的 GUI(用 PyQt 编写),每个选项卡一个 QtGui.QMainWindow class。整个 GUI 由 .ui 文件定义。这似乎是人们希望隐藏 QMainWindow 对象的 SO(下一段中的链接)上的类似问题之间的主要区别。更具体地说,我试图隐藏一个 QMainWindow 对象,它是(不是整个)Gui 元素的一部分。
主要 window 及其选项卡如下所示:
根据我的配置文件中的设置,我想让 TEST 保持可见,或者对用户隐藏它。我已经检查了 PyQT Docs (ie removeDockWidget()
?) and there are two similar SO queries (Link One and ), and a SO Question suggesting layouts/setVisible..
但我做不对。如果我使用 .hide()
或 .setVisible(False)
那么似乎没有任何改变。如果我设置 .setVisible(True)
,那么在启动时会出现一个额外的微型 window,名称为我的主程序 class。
我的代码结构是:
我的entry/mainclass:
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 选项卡是我想要的 hide/show:
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()
---编辑以协助回答/我的匹配评论在下面回答---
因此,class GuiMainTestTab
通过其成员 self.ui
访问 ui 文件的内容。通过 ui 文件,我发现 testTab
是 ui 文件中测试选项卡的名称(与 GuiMainWindow
中的 testTab
相对)..! ).它附加到一个名为 verticalTabWidget 的 QTabWidget。因此,以编程方式找到测试选项卡的索引,并将其删除:
testIdx = self.ui.verticalTabWidget.indexOf(self.ui.testTab)
self.ui.verticalTabWidget.removeTab(testIdx)
QWidget
-based actions like close()
, hide()
, setVisible(True)
are not effecting your QTabWidget
-容器,就是包含页面(标签)。
由于 show
、hide
和 visibility-property 的其他访问函数也被容器使用,您的更改稍后将被覆盖。
您可以在另一个选项卡处于活动状态时通过调用 testTab.show()
来查看。
要对用户隐藏选项卡,您可以:
- 根本就不是 create/add 他一开始(修改你的
setupUi()
-函数)
- 使用以下方法从容器 (
QTabWidget
) 中删除选项卡:
tabWidget.removeTab(index)
这是使用第二种方法的最小工作示例:
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()
and QTabWidget.insert()
or QTabWidget.addTab()
,如果您需要 "hidden" 选项卡中的某些内容,您甚至可以照常访问所有内容。
我在 "Tab 2" 上添加了一个 QLineEdit 以显示删除时没有数据丢失,只需在其中键入内容并尝试。
我有一个带有三个选项卡的 GUI(用 PyQt 编写),每个选项卡一个 QtGui.QMainWindow class。整个 GUI 由 .ui 文件定义。这似乎是人们希望隐藏 QMainWindow 对象的 SO(下一段中的链接)上的类似问题之间的主要区别。更具体地说,我试图隐藏一个 QMainWindow 对象,它是(不是整个)Gui 元素的一部分。
主要 window 及其选项卡如下所示:
根据我的配置文件中的设置,我想让 TEST 保持可见,或者对用户隐藏它。我已经检查了 PyQT Docs (ie removeDockWidget()
?) and there are two similar SO queries (Link One and
但我做不对。如果我使用 .hide()
或 .setVisible(False)
那么似乎没有任何改变。如果我设置 .setVisible(True)
,那么在启动时会出现一个额外的微型 window,名称为我的主程序 class。
我的代码结构是:
我的entry/mainclass:
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 选项卡是我想要的 hide/show:
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()
---编辑以协助回答/我的匹配评论在下面回答---
因此,class GuiMainTestTab
通过其成员 self.ui
访问 ui 文件的内容。通过 ui 文件,我发现 testTab
是 ui 文件中测试选项卡的名称(与 GuiMainWindow
中的 testTab
相对)..! ).它附加到一个名为 verticalTabWidget 的 QTabWidget。因此,以编程方式找到测试选项卡的索引,并将其删除:
testIdx = self.ui.verticalTabWidget.indexOf(self.ui.testTab)
self.ui.verticalTabWidget.removeTab(testIdx)
QWidget
-based actions like close()
, hide()
, setVisible(True)
are not effecting your QTabWidget
-容器,就是包含页面(标签)。
由于 show
、hide
和 visibility-property 的其他访问函数也被容器使用,您的更改稍后将被覆盖。
您可以在另一个选项卡处于活动状态时通过调用 testTab.show()
来查看。
要对用户隐藏选项卡,您可以:
- 根本就不是 create/add 他一开始(修改你的
setupUi()
-函数) - 使用以下方法从容器 (
QTabWidget
) 中删除选项卡:tabWidget.removeTab(index)
这是使用第二种方法的最小工作示例:
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()
and QTabWidget.insert()
or QTabWidget.addTab()
,如果您需要 "hidden" 选项卡中的某些内容,您甚至可以照常访问所有内容。
我在 "Tab 2" 上添加了一个 QLineEdit 以显示删除时没有数据丢失,只需在其中键入内容并尝试。