python - 如何向 QTabWidget 添加新选项卡

标签 python pyqt pyqt5 qtabwidget

我有一个 QtTabWidget,上面挂着 1 个(或 2 个)小部件(我的主页小部件),如下所示:

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”现在是“win”的父级。 我还有一个带有“添加选项卡”和“删除选项卡”的工具栏。删除/退出处理程序正在工作,就像

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 

但是我的“添加选项卡”处理程序写为

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 和一个窗口,并将窗口挂到选项卡上。所以我相信,“tabs”是父级,“win”是子级。 然后第 26 行的“newTabHandler()”应该向选项卡添加另一个选项卡。但此方法是 MainWindow 的实例方法,看不到 main() 本地的“选项卡”。所以我通过parentWidget()遍历父子关系。另请注意,第 27 行和第 31 行的 print() 语句报告了正确的制表符计数。但我没有看到呈现的新选项卡。也许我错过了针对某些对象的 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()方法:

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))

关于python - 如何向 QTabWidget 添加新选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59080152/

相关文章:

python - 为什么这个 Python 脚本会删除 '.txt' 文件,以及所有 '.tmp' 文件?

python - QLineEdit PyQT5 输入上的火柴盒键盘

python - 删除列表中的重复项

python - 检测 .pythonrc.py 中的可执行文件(python?ipython?)

python - 防止 okay QPushButton 在按回车时接受对话框

python - 如何在 Pyqt 中创建只读组合框?

python - 未在不同类中使用 Signals and slots PyQt5 定义 Url

python - 如何在pyqt5中允许tab键按下事件

python - Django REST Framework 序列化 ForeignKey 和 ManyToManyFields

python - QPaint 使用 mouseevent 进行平移缩放