PyQT - 在特定选项卡中引用小部件
Posted
技术标签:
【中文标题】PyQT - 在特定选项卡中引用小部件【英文标题】:PyQT - referencing a widget within a specific tab 【发布时间】:2014-08-17 22:05:01 【问题描述】:例如,我想要一个选项卡中的按钮来清除该选项卡中的 textEdit 框,(我知道我可以直接执行此操作,但我想知道如何从该函数返回到小部件)但我可以' t弄清楚如何引用文本编辑:
(缩进在这里搞砸了,但我的结果很好)
#!/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() 和大约十几个其他变体,但没有任何乐趣,我遗漏了一些明显的东西。 (也许就像一个大脑。)
我找到了这个答案,但我太愚蠢了,无法理解我应该做什么: How to reference a widget inside a specific tab of a QTabWidget?
任何帮助表示赞赏!
编辑:我可以通过在 initUI 中粘贴“全局结果”并从函数中调用“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”的方式,但也许这就是我。
【讨论】:
谢谢,这让我明白了一些事情。目前,虽然我只是在做一些我必须全球化的东西,因为它很简单而且很有效。 :) 好的...但是分配给 self 可能更清晰、更正确,在我看来比设置全局更容易。以上是关于PyQT - 在特定选项卡中引用小部件的主要内容,如果未能解决你的问题,请参考以下文章