如何向 QTabWidget 添加新选项卡
How to add a new tab to QTabWidget
我有一个带有 1(或 2)个小部件(我的主页小部件)的 QtTabWidget,如下所示:
330 for i in range(1):
331 win = MainWindow()
332 tabs.addTab(win, QIcon('running.png'), "Test-%d" % i)
333 tabs.show()
334 print("tab count = %d" % tabs.count())
据我所知,'tabs' 现在是 parent 到 'win'。
我还有一个带有 "Add Tab" 和 "Remove Tab" 的工具栏。 remove/quit 处理程序正在工作,就像
254 # ----------------------- quitHandler() ------------------------
255 def quitHandler(self):
256 if ( self.parentWidget().count() == 1 ):
257 self.statusBar.setText('I am the last one, you can not kill me ....')
258 return
259 tab = self.parentWidget().currentWidget()
260 self.close()
261 self.parentWidget().removeWidget(tab)
262
但是我的 "Add Tab" 处理程序写成
263 # ----------------------- newTabHandler() ------------------------
264 def newTabHandler(self):
265 count = self.parentWidget().count()
266 if ( count > 10 ):
267 self.statusBar.setText('I only support 10 tabs ....')
268 return
269 win = MainWindow()
270 self.parentWidget().addWidget(win)
271 self.parentWidget().show()
272 print(self.parentWidget().count())
未呈现新标签。但是我看到选项卡数量在增加..这是日志
medi@medi:~/proto/python/d1> ./utg
tab count = 1
2
3
4
5
感谢您的帮助。
根据要求,这是显示问题陈述的最少代码:
1 #!/usr/bin/python3
2
3 import sys
4 import os
5
6 from PyQt5 import (QtCore, QtWidgets, QtGui)
7 from PyQt5.QtGui import (QIcon)
8 from PyQt5.QtWidgets import (QMainWindow, QPushButton, QLabel, QLineEdit, QTextEdit)
9 from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QVBoxLayout, QGroupBox, QGridLayou t)
10 from PyQt5.QtWidgets import (QFormLayout, QSizePolicy, QAction, QToolBar)
11 from PyQt5.QtCore import (QSize, QProcess)
12
13 class MainWindow(QMainWindow):
14 def __init__(self):
15 super().__init__()
16 self.setWindowTitle('tabs mgmnt test')
17 self.setGeometry(50, 50, 600, 600)
18
19 self.toolbar = QToolBar('My Main Tool Bar')
20 self.addToolBar(self.toolbar)
21 newTabAct = QAction('New Tab', self)
22 self.toolbar.addAction(newTabAct)
23 newTabAct.triggered.connect(self.newTabHandler)
24
25 # ----------------------- newTabHandler() ------------------------
26 def newTabHandler(self):
27 print("before new tab, tab-count = %d" % self.parentWidget().count() )
28 win = MainWindow()
29 self.parentWidget().addWidget(win)
30 self.parentWidget().show()
31 print("after new tab, tab-count = %d" % self.parentWidget().count() )
32
33 # ================================= main() ==========================
34 if (__name__ == "__main__"):
35 app = QtWidgets.QApplication(sys.argv)
36 tabs = QtWidgets.QTabWidget()
37 win = MainWindow()
38 tabs.addTab(win, "Tab-1" )
39 tabs.show()
40 sys.exit ( app.exec_() )
41
正如所见,在 main() 和第 36 行中,我创建了一个 QTabWidget 和一个 window 并将 window 挂到 tabs.So 我相信,'tabs' 是 parent 而 'win' 是一个 child。
然后第 26 行的 'newTabHandler()' 应该在 tabs 中添加另一个选项卡。但是这个方法是MainWindow的一个实例方法,并没有看到main()本地的'tabs'。所以我通过 parentWidget() 遍历 parent-child 关系。另请注意,第 27 行和第 31 行的 print() 语句报告了正确的制表符计数。但是我没有看到呈现的新选项卡。也许我错过了一些 object 的 show() 。这是我在第 30 行所做的。但是没有呈现新选项卡,我只看到一个选项卡,即在 main() 中创建的选项卡。
要了解问题,您必须在 newTabHandler 中打印 parentWidget():
def newTabHandler(self):
print(self.parentWidget())
您会注意到,每次尝试添加标签时,您都会得到:
<PyQt5.QtWidgets.QStackedWidget object at 0x7f3e4e2680d0>
<PyQt5.QtWidgets.QStackedWidget object at 0x7f3e4e2680d0>
<PyQt5.QtWidgets.QStackedWidget object at 0x7f3e4e2680d0>
...
所以 parentWidget() 不是 QTabWidget 而是 QStackedWidget。
解释:
QTabWidget 是 QTabBar + QStackedWidget,每次使用 addTab() 添加小部件时,小部件都会添加到 QStackedWidget 并在 QTabBar 中创建一个新选项卡,因此相应地小部件的父级是QStackedWidget.
解法:
考虑到上述情况,解决方案是使用 QStackedWidget 的 parentWidget() 即 QTabWidget,或者在您提供的代码中因为 QTabWidget 是 window 然后使用 window() 方法:
def newTabHandler(self):
tab_widget = self.parentWidget().parentWidget()
# QStackedLayout QStackedWidget
# or
# tab_widget = self.window()
print(tab_widget)
count = tab_widget.count()
win = MainWindow()
tab_widget.addTab(win, "Tab-{}".format(count + 1))
我有一个带有 1(或 2)个小部件(我的主页小部件)的 QtTabWidget,如下所示:
330 for i in range(1):
331 win = MainWindow()
332 tabs.addTab(win, QIcon('running.png'), "Test-%d" % i)
333 tabs.show()
334 print("tab count = %d" % tabs.count())
据我所知,'tabs' 现在是 parent 到 'win'。 我还有一个带有 "Add Tab" 和 "Remove Tab" 的工具栏。 remove/quit 处理程序正在工作,就像
254 # ----------------------- quitHandler() ------------------------
255 def quitHandler(self):
256 if ( self.parentWidget().count() == 1 ):
257 self.statusBar.setText('I am the last one, you can not kill me ....')
258 return
259 tab = self.parentWidget().currentWidget()
260 self.close()
261 self.parentWidget().removeWidget(tab)
262
但是我的 "Add Tab" 处理程序写成
263 # ----------------------- newTabHandler() ------------------------
264 def newTabHandler(self):
265 count = self.parentWidget().count()
266 if ( count > 10 ):
267 self.statusBar.setText('I only support 10 tabs ....')
268 return
269 win = MainWindow()
270 self.parentWidget().addWidget(win)
271 self.parentWidget().show()
272 print(self.parentWidget().count())
未呈现新标签。但是我看到选项卡数量在增加..这是日志
medi@medi:~/proto/python/d1> ./utg
tab count = 1
2
3
4
5
感谢您的帮助。
根据要求,这是显示问题陈述的最少代码:
1 #!/usr/bin/python3
2
3 import sys
4 import os
5
6 from PyQt5 import (QtCore, QtWidgets, QtGui)
7 from PyQt5.QtGui import (QIcon)
8 from PyQt5.QtWidgets import (QMainWindow, QPushButton, QLabel, QLineEdit, QTextEdit)
9 from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QVBoxLayout, QGroupBox, QGridLayou t)
10 from PyQt5.QtWidgets import (QFormLayout, QSizePolicy, QAction, QToolBar)
11 from PyQt5.QtCore import (QSize, QProcess)
12
13 class MainWindow(QMainWindow):
14 def __init__(self):
15 super().__init__()
16 self.setWindowTitle('tabs mgmnt test')
17 self.setGeometry(50, 50, 600, 600)
18
19 self.toolbar = QToolBar('My Main Tool Bar')
20 self.addToolBar(self.toolbar)
21 newTabAct = QAction('New Tab', self)
22 self.toolbar.addAction(newTabAct)
23 newTabAct.triggered.connect(self.newTabHandler)
24
25 # ----------------------- newTabHandler() ------------------------
26 def newTabHandler(self):
27 print("before new tab, tab-count = %d" % self.parentWidget().count() )
28 win = MainWindow()
29 self.parentWidget().addWidget(win)
30 self.parentWidget().show()
31 print("after new tab, tab-count = %d" % self.parentWidget().count() )
32
33 # ================================= main() ==========================
34 if (__name__ == "__main__"):
35 app = QtWidgets.QApplication(sys.argv)
36 tabs = QtWidgets.QTabWidget()
37 win = MainWindow()
38 tabs.addTab(win, "Tab-1" )
39 tabs.show()
40 sys.exit ( app.exec_() )
41
正如所见,在 main() 和第 36 行中,我创建了一个 QTabWidget 和一个 window 并将 window 挂到 tabs.So 我相信,'tabs' 是 parent 而 'win' 是一个 child。 然后第 26 行的 'newTabHandler()' 应该在 tabs 中添加另一个选项卡。但是这个方法是MainWindow的一个实例方法,并没有看到main()本地的'tabs'。所以我通过 parentWidget() 遍历 parent-child 关系。另请注意,第 27 行和第 31 行的 print() 语句报告了正确的制表符计数。但是我没有看到呈现的新选项卡。也许我错过了一些 object 的 show() 。这是我在第 30 行所做的。但是没有呈现新选项卡,我只看到一个选项卡,即在 main() 中创建的选项卡。
要了解问题,您必须在 newTabHandler 中打印 parentWidget():
def newTabHandler(self):
print(self.parentWidget())
您会注意到,每次尝试添加标签时,您都会得到:
<PyQt5.QtWidgets.QStackedWidget object at 0x7f3e4e2680d0>
<PyQt5.QtWidgets.QStackedWidget object at 0x7f3e4e2680d0>
<PyQt5.QtWidgets.QStackedWidget object at 0x7f3e4e2680d0>
...
所以 parentWidget() 不是 QTabWidget 而是 QStackedWidget。
解释:
QTabWidget 是 QTabBar + QStackedWidget,每次使用 addTab() 添加小部件时,小部件都会添加到 QStackedWidget 并在 QTabBar 中创建一个新选项卡,因此相应地小部件的父级是QStackedWidget.
解法:
考虑到上述情况,解决方案是使用 QStackedWidget 的 parentWidget() 即 QTabWidget,或者在您提供的代码中因为 QTabWidget 是 window 然后使用 window() 方法:
def newTabHandler(self):
tab_widget = self.parentWidget().parentWidget()
# QStackedLayout QStackedWidget
# or
# tab_widget = self.window()
print(tab_widget)
count = tab_widget.count()
win = MainWindow()
tab_widget.addTab(win, "Tab-{}".format(count + 1))