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 - 在特定选项卡中引用小部件的主要内容,如果未能解决你的问题,请参考以下文章

每个选项卡小部件的 PyQt 选项

从多个类组成 PyQt5 UI

选择选项卡小部件时如何连接事件?

如何访问 QTabWidget 不同选项卡中的小部件?

如何使布局填充qt选项卡小部件内的所有内容?

在选项卡中调用选项卡? jQuery手机