PyQT - 在特定标签页中引用小部件

0 投票
1 回答
3037 浏览
提问于 2025-04-18 17:36

举个例子,我想在一个标签页里放一个按钮,这个按钮可以清空那个标签页里的文本编辑框。(我知道可以直接这样做,但我想知道怎么从函数里回到这个控件)不过我就是搞不清楚怎么引用这个文本编辑框:

(这里的缩进有点乱,但我这边是正常的)

#!/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 里加上 'global results',然后在函数里调用 'results.clear()' 来让它工作,但肯定还有更正确的方法吧?

1 个回答

0

首先,你的标签布局真的能正常工作吗?我知道有很多种方法可以做到这一点,但你从来没有在你的 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”的做法,但也许只是我个人的看法。

撰写回答