PyQT -在特定选项卡中引用小部件



例如,我想要一个选项卡中的按钮来清除该选项卡中的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式"的方式,但也许这只是我的看法。

最新更新