例如,我想要一个选项卡中的按钮来清除该选项卡中的texttedit框(我知道我可以直接这样做,但我想知道如何从函数返回到小部件),但我不知道如何引用texttedit:
(缩进在这里很乱,但在我的末尾很好)
#!/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内粘贴"全局结果"并从函数中调用"results.clear()"来让它工作,但肯定有更正确的方法?
首先,你的标签布局的东西实际上工作吗?我知道有不同的方法可以做到这一点,但您从来没有专门设置您的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"方法做到这一点,让我知道。我认为这是一种"python式"的方式,但也许这只是我的看法。