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

时间:2014-08-17 22:05:02

标签: python qt tabs

例如,我想要一个选项卡中的按钮来清除该选项卡中的textEdit框,(我知道我可以直接执行此操作,但我想知道如何从函数中返回到小部件)但是我可以&# 39;弄清楚如何引用textEdit:

(缩进在这里搞砸了但在我的结尾很好)

#!/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?

任何帮助表示赞赏!

编辑:我可以通过坚持全球结果来实现这一目标&#39;在initUI内部并调用&#39; results.clear()&#39;从功能,但肯定有更正确的方法?

1 个答案:

答案 0 :(得分:0)

首先,您的标签布局确实有效吗?我知道有不同的方法可以做到这一点,但你从未在tab1小部件上专门设置布局。我会这样做:

tab1 = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
tab1.setLayout(layout)

其次,您引用的链接是关于从QTabWidget获取单个选项卡小部件。在您的情况下,这将从tab1获得tab_widget

第三,在clearit函数中,您无法引用initUI函数中的任何旧变量。如果您不熟悉python变量范围,您可能需要查找它。您从clearit函数引用的任何内容都必须是全局的(通常是不必要的或不好的实践),或者必须作为参数传递。由于QWidgets是对象,因此您将获得对对象实例本身的引用self。所以你可以做这样的事情来获得对results对象(未经测试)的引用:

results = self.layout.children()[0].widget(0).layout.children()[1]
results.clear()

还有其他方法可以让孩子们,但最重要的是你要遍历一系列布局和小工具来获取对象。最简单的解决方案(可能是您所称的“直接”方法)是在使用initUI对象后将其放入results函数中:

self.results = results

然后在clearit函数中:

self.results.clear()

如果有更多的“Qt”方式,请告诉我。我认为这是“pythonic”的方式,但也许这只是我。