PyQT - 在特定标签页中引用小部件
举个例子,我想在一个标签页里放一个按钮,这个按钮可以清空那个标签页里的文本编辑框。(我知道可以直接这样做,但我想知道怎么从函数里回到这个控件)不过我就是搞不清楚怎么引用这个文本编辑框:
(这里的缩进有点乱,但我这边是正常的)
#!/usr/bin/python
import sys
from PyQt4 import QtGui, QtCore
class CC(QtGui.QWidget):
def __init__(self):
super(CC, self).__init__()
self.initUI()
def initUI(self):
tab_widget = QtGui.QTabWidget(self)
################## tab1
tab1 = QtGui.QWidget()
layout = QtGui.QVBoxLayout(tab1)
###### add widgets to layout
clear = QtGui.QPushButton('clear results box', tab1)
clear.resize(clear.sizeHint())
clear.move(50, 50)
clear.clicked.connect(self.clearit)
results = QtGui.QTextEdit(tab1)
results.move(250, 50)
results.setFixedWidth(450)
results.setFixedHeight(350)
######################
tab_widget.addTab(tab1, "Tab 1")
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(tab_widget)
self.setGeometry(300, 300, 800, 500)
self.setFixedSize(800, 500)
self.setWindowTitle('Crouton MN Toolw v05')
self.setWindowIcon(QtGui.QIcon('drk.ico'))
self.setLayout(mainLayout)
self.show()
def clearit(self):
tab1.results.clear() ##### <<< here is what doesn't work, please help :)
#self.results.clear()
def main():
app = QtGui.QApplication(sys.argv)
ex = CC()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
我试过用 self.results.clear()、tab_widget.results.clear()、tab1.results.clear() 还有其他十几种不同的写法,但都不行,我感觉我漏掉了什么明显的东西。(可能是脑子吧。)
我找到过这个答案,但我觉得我太笨了,没搞明白我到底该怎么做:如何引用 QTabWidget 中特定标签页里的控件?
任何帮助都非常感谢!
补充:我可以通过在 initUI 里加上 'global results',然后在函数里调用 'results.clear()' 来让它工作,但肯定还有更正确的方法吧?
1 个回答
首先,你的标签布局真的能正常工作吗?我知道有很多种方法可以做到这一点,但你从来没有在你的 tab1
小部件上具体设置布局。我建议你这样做:
tab1 = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
tab1.setLayout(layout)
其次,你提到的链接是在讲如何从 QTabWidget
中获取单个标签小部件。在你的情况下,就是从 tab_widget
中获取 tab1
。
第三,在你的 clearit
函数中,你不能随便引用 initUI
函数中的变量。如果你对 Python 的变量作用域不太了解,建议你查一下。你在 clearit
函数中引用的任何东西,要么必须是全局变量(通常不必要或者不太好),要么必须作为参数传递。因为 QWidgets
是对象,你可以直接使用对象实例的引用,也就是 self
。所以你可以这样做来获取 results
对象的引用(未测试):
results = self.layout.children()[0].widget(0).layout.children()[1]
results.clear()
还有其他方法可以获取子对象,但总的来说,你是在遍历一系列布局和小部件来找到一个对象。最简单的解决方案(也许就是你所说的“直接”方法)是在处理 results
对象后,把这个放在你的 initUI
函数中:
self.results = results
然后在 clearit
函数中:
self.results.clear()
如果还有其他“Qt”的方法来做到这一点,告诉我。我认为这是“Pythonic”的做法,但也许只是我个人的看法。