我正在 PyQt4 中开发一个编辑配置文件的工具。每次加载文件时,它都会更改 GUI。编辑器 GUI 是一个 QTabWidget,其中包含与加载文件中的章节数一样多的选项卡。在每个选项卡上,它都有与加载文件中的小节相对应的 QGroupBox,最后这些组包含与实际配置参数和值对应的 QLineEdits。
所有这些都是从一本大字典中构建的,并且在一定程度上工作正常:
- 所有选项卡都正确显示
- 所有组在所有选项卡中正确显示
- 但是行编辑仅显示在第一个选项卡的第一组中
LineEdit 对象也是为其他组创建的,我打印了它们,它们都指向不同的内存位置 - 它们仍然没有显示。
这是代码的相应部分:
while self.tabWidget.widget(0):
self.tabWidget.removeTab(0)
for i in data['tabList']:
self.log("Adding tab: '%s'" % i, DEBUG)
self.data['tabDict'][i]['scrollarea'] = QScrollArea()
self.data['tabDict'][i]['vbox'] = QVBoxLayout()
for j in self.data['tabDict'][i]['groupList']:
self.log("Adding group: '%s'" % j, DEBUG)
self.data['tabDict'][i]['groupDict'][j]['groupbox'] = QGroupBox(j)
self.data['tabDict'][i]['groupDict'][j]['formlo'] = QFormLayout()
print self.data['tabDict'][i]['groupDict'][j]['formlo']
for k in self.data['tabDict'][i]['groupDict'][j]['fields']:
self.log("Adding field: '%s'" % k['name'])
k['lineedit'] = QLineEdit(k['value'])
k['lineedit'].setToolTip('<b>Type:</b> %s<br><b>TSDB path:</b> %s<br><b>Line:</b> %d<br><b>Comment:</b> %s' % (k['type'],k['path'],k['row'], k['comment']))
self.data['tabDict'][i]['groupDict'][j]['formlo'].addRow(k['name'], k['lineedit'])
self.data['tabDict'][i]['groupDict'][j]['groupbox'].setLayout(self.data['tabDict'][i]['groupDict'][j]['formlo'])
self.data['tabDict'][i]['vbox'].addWidget(self.data['tabDict'][i]['groupDict'][j]['groupbox'])
self.data['tabDict'][i]['scrollarea'].setLayout(self.data['tabDict'][i]['vbox'])
self.tabWidget.addTab(self.data['tabDict'][i]['scrollarea'], i)
我在这里错过了什么?
频道上得到了答案,感谢 freenode 上 #pyqt 的人。问题是QScrollArea
需要一个由setWidget()
设置的QWidget
,并且应该包含QVBoxLayout
。
这是固定代码:
while self.tabWidget.widget(0):
self.tabWidget.removeTab(0)
for i in data['tabList']:
self.log("Adding tab: '%s'" % i, DEBUG)
self.data['tabDict'][i]['scrollarea'] = QScrollArea()
self.data['tabDict'][i]['scrollarea'].setWidgetResizable(True)
self.data['tabDict'][i]['widget'] = QWidget()
self.data['tabDict'][i]['vbox'] = QVBoxLayout()
for j in self.data['tabDict'][i]['groupList']:
self.log("Adding group: '%s'" % j, DEBUG)
self.data['tabDict'][i]['groupDict'][j]['groupbox'] = QGroupBox(j)
self.data['tabDict'][i]['groupDict'][j]['formlo'] = QFormLayout()
print self.data['tabDict'][i]['groupDict'][j]['formlo']
for k in self.data['tabDict'][i]['groupDict'][j]['fields']:
self.log("Adding field: '%s'" % k['name'])
k['lineedit'] = QLineEdit(k['value'])
k['lineedit'].setToolTip('<b>Type:</b> %s<br><b>TSDB path:</b> %s<br><b>Line:</b> %d<br><b>Comment:</b> %s' % (k['type'],k['path'],k['row'], k['comment']))
self.data['tabDict'][i]['groupDict'][j]['formlo'].addRow(k['name'], k['lineedit'])
self.data['tabDict'][i]['groupDict'][j]['groupbox'].setLayout(self.data['tabDict'][i]['groupDict'][j]['formlo'])
self.data['tabDict'][i]['vbox'].addWidget(self.data['tabDict'][i]['groupDict'][j]['groupbox'])
self.data['tabDict'][i]['widget'].setLayout(self.data['tabDict'][i]['vbox'])
self.data['tabDict'][i]['scrollarea'].setWidget(self.data['tabDict'][i]['widget'])
self.tabWidget.addTab(self.data['tabDict'][i]['scrollarea'], i)
不过,是什么导致了第一个代码的奇怪行为仍然是一个悬而未决的问题。 :)