python - PyQt 多个 tablewidgets 和 tabwidgets

标签 python python-2.7 pyqt pyqt4 qtabwidget

我的目标是在一个 QMainWindow 中显示 10 个或更多 QTabWidget,每个选项卡都包含一个唯一的 QLabelQTableWidget。像这样的事情:

enter image description here

尽管我设法使用以下代码获得了预期的结果,但我想知道是否有更有效的方法或更短的方法来实现相同的结果。

    Tab = QtGui.QTabWidget()
    Tab1 = QtGui.QWidget()
    Tab2 = QtGui.QWidget()
    Tab3 = QtGui.QWidget()
    Tab4 = QtGui.QWidget()
    Tab5 = QtGui.QWidget()
    Tab6 = QtGui.QWidget()
    Tab7 = QtGui.QWidget()
    Tab8 = QtGui.QWidget()
    Tab9 = QtGui.QWidget()
    Tab10 = QtGui.QWidget()

    Tab.addTab(Tab1, QtCore.QString('SECTION A'))
    Tab.addTab(Tab2, QtCore.QString('SECTION B'))
    Tab.addTab(Tab3, QtCore.QString('SECTION C'))
    Tab.addTab(Tab4, QtCore.QString('SECTION D'))
    Tab.addTab(Tab5, QtCore.QString('SECTION E'))
    Tab.addTab(Tab6, QtCore.QString('SECTION F'))
    Tab.addTab(Tab7, QtCore.QString('SECTION G'))
    Tab.addTab(Tab8, QtCore.QString('SECTION H'))
    Tab.addTab(Tab9, QtCore.QString('SECTION I'))
    Tab.addTab(Tab10, QtCore.QString('SECTION J'))     

    title1 = QtGui.QLabel('title')
    title2 = QtGui.QLabel('title')
    title3 = QtGui.QLabel('title')
    title4 = QtGui.QLabel('title')
    title5 = QtGui.QLabel('title')
    title6 = QtGui.QLabel('title')
    title7 = QtGui.QLabel('title')
    title8 = QtGui.QLabel('title')
    title9 = QtGui.QLabel('title')
    title10 = QtGui.QLabel('title')

    self.Table1 = QtGui.QTableWidget()
    self.Table2 = QtGui.QTableWidget()
    self.Table3 = QtGui.QTableWidget()
    self.Table4 = QtGui.QTableWidget()
    self.Table5 = QtGui.QTableWidget()
    self.Table6 = QtGui.QTableWidget()
    self.Table7 = QtGui.QTableWidget()
    self.Table8 = QtGui.QTableWidget()
    self.Table9 = QtGui.QTableWidget()
    self.Table10 = QtGui.QTableWidget()

    Layout1 = QtGui.QVBoxLayout()
    Layout2 = QtGui.QVBoxLayout()
    Layout3 = QtGui.QVBoxLayout()
    Layout4 = QtGui.QVBoxLayout()
    Layout5 = QtGui.QVBoxLayout()
    Layout6 = QtGui.QVBoxLayout()
    Layout7 = QtGui.QVBoxLayout()
    Layout8 = QtGui.QVBoxLayout()
    Layout9 = QtGui.QVBoxLayout()
    Layout10 = QtGui.QVBoxLayout()

    tablist = [Tab1,Tab2,Tab3,Tab4,Tab5,Tab6,Tab7,Tab8,Tab9,Tab10]
    tablabellist = [title1,title2,title3,title4,title5,title6,title7,title8,title9,title10]      
    self.tablelist = [self.Table1,self.Table2,self.Table3,self.Table4,self.Table5,self.Table6,self.Table7,self.Table8,self.Table9,self.Table10]
    layoutlist = [Layout1,Layout2,Layout3,Layout4,Layout5,Layout6,Layout7,Layout8,Layout9,Layout10]      
    headerlist = [ 'ID','Question','Answer 1','Answer 2','Answer 3','Difficulty','Statistics','Date Added','Added By','Date Modified']

    for item in self.tablelist:
        item.setColumnCount(len(headerlist))
        item.setHorizontalHeaderLabels(headerlist)
        item.setEditTriggers(QtGui.QTableWidget.NoEditTriggers)
        item.setSelectionBehavior(QtGui.QTableWidget.SelectRows)
        item.setSelectionMode(QtGui.QTableWidget.SingleSelection)

    for i in range (len(layoutlist)):
        layoutlist[i].addWidget(tablabellist[i])
        layoutlist[i].addWidget(self.tablelist[i])
        tablist[i].setLayout(layoutlist[i])

    CLayout = QtGui.QVBoxLayout()
    CLayout.addWidget(Tab)

    Cwidget = QtGui.QWidget()
    Cwidget.setLayout(CLayout)    
    self.setCentralWidget(Cwidget)

如果我按照上面使用的相同方式添加 20 个 TabWidget,将会非常困惑和乏味。

是否可以在保持相同输出的同时缩短我的代码?

最佳答案

类似这样的事情应该可以做到:

tablist = []
tablabellist = []
layoutlist=[]
self.tablelist = []
Tab = QtGui.QTabWidget()
headerlist = [ 'ID','Question','Answer 1','Answer 2','Answer 3','Difficulty','Statistics','Date Added','Added By','Date Modified']

num_tab_widgets = 10

for i in range(num_tab_widgets):
    tablist.append(QtGui.QWidget())
    Tab.addTab(tablist[i], QtCore.QString('SECTION %s'%chr(ord('A')+i)))
    tablabellist.append(QtGui.QLabel('title'))
    self.tablelist.append(QtGui.QTableWidget())
    setattr(self,'Table%d'%i,self.tablelist[i])
    layoutlist.append(QtGui.QVBoxLayout())

    self.tablelist[i].setColumnCount(len(headerlist))
    self.tablelist[i].setHorizontalHeaderLabels(headerlist)
    self.tablelist[i].setEditTriggers(QtGui.QTableWidget.NoEditTriggers)
    self.tablelist[i].setSelectionBehavior(QtGui.QTableWidget.SelectRows)
    self.tablelist[i].setSelectionMode(QtGui.QTableWidget.SingleSelection)

    layoutlist[i].addWidget(tablabellist[i])
    layoutlist[i].addWidget(self.tablelist[i])
    tablist[i].setLayout(layoutlist[i])

CLayout = QtGui.QVBoxLayout()
CLayout.addWidget(Tab)

Cwidget = QtGui.QWidget()
Cwidget.setLayout(CLayout)    
self.setCentralWidget(Cwidget)

请注意,可能没有必要保存列表中的所有内容,或作为实例(自身)的一部分,但我不会质疑它,因为我不知道应用程序的其余部分做什么!希望这能为您提供足够的信息来自行简化。

关于python - PyQt 多个 tablewidgets 和 tabwidgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19555297/

相关文章:

pyqt - 如何在 PyQt5 中更改样式

python - Qt 和 PyQt 混合应用

python - PyQt 信号中的保证和使用队列的比较

python - 使用 mechanize 和 beautifulsoup 进行网页抓取 - 无法写入输出文件

html - 如何使用 cherrypy 将 mysql 数据库表中的值显示到 html 页面中?

python - 在 Python 2.7 中使用输入模块

c# - 将 Python 翻译成 C# - 随机数组

python - 无法在 docker 容器中安装任何 python 包

python - 将几乎没有或没有异常的名称聚类/分组到 Pandas 中的聚类中

Python 在列表括号内使用大括号