按名称查找QLabel并使用setText()函数

问题描述 投票:0回答:2

我已经做了很多研究,但到目前为止找不到任何有这个特定问题的人。非常抱歉,如果已经有一个主题,但无法找到它。

我想要做的是通过导入.txt文件并读出名称和值来在QGridLayout中找到QLabel。例如:power 5

现在我需要找到名为“power_fw”的QLabel,将此Label的文本设置为“5”

set_value("power 5")

def set_value(talent):
     list_value = talent.split(" ")       # Now i have a list with talent[0] = "power" and its value at talent[1] = "5"
     talent_now = talent[0] + "_fw"       # I already have the exact name of the QLabel i am trying to find, which would be "power_fw" at this moment
     ui.talent_now.setText(talent[1])     # So the idea is that "talent_now" is a string whichs value is the name of the QLabel i am trying to set a new text. Obviously it does not work, because talent_now is not a QLabel but just its name. 

我希望有人可以帮助我解决这个具体问题,再次,抱歉,如果这个话题已经存在某种方式。我找不到任何有用的东西。

我在这个问题的背景下发现有趣的主题:

get widgets by name from layout

findChild on object created within pyqt designer

这些主题中提供的解决方案都没有让我能够做到这一点。

python qt pyqt5 qlabel qtwidgets
2个回答
0
投票

您始终可以遍历布局项并检查每个窗口小部件objectName。

这是满足您要求的有效解决方案吗?

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QLabel, QPushButton
from PyQt5.QtCore import pyqtSlot

if __name__ == '__main__':
    app = QApplication(sys.argv)

    label1 = QLabel()
    label1.setText('label1')
    label1.setObjectName('label1')

    label2 = QLabel()
    label2.setText('label2')
    label2.setObjectName('label2')

    btn = QPushButton("find label")

    layout = QGridLayout()
    layout.addWidget(label1, 0, 0)
    layout.addWidget(label2, 0, 1)
    layout.addWidget(btn, 1, 0, 1, 2)

    w = QWidget()
    w.setLayout(layout)
    w.resize(500, 400)
    w.show()

    def find_label(event):
        print('click')
        childs_count = layout.count()
        for c in range(childs_count):
            w = layout.itemAt(c)
            if w.widget().objectName() == 'label2':
                print('FOUND widget: {}'.format(w.widget().objectName()))

    btn.clicked.connect(find_label)

    sys.exit(app.exec())

0
投票

您可以使用QWidget::findChild方法查找特定对象。当您需要递归搜索时,它非常有用:

    label1 = QLabel()
    label1.setObjectName("power")
    label2 = QLabel()
    label2.setObjectName("status")
    label3 = QLabel()
    label3.setObjectName("info")

    w = QWidget()
    layout = QVBoxLayout(w)
    layout.addWidget(label1)
    layout.addWidget(label2)
    layout.addWidget(label3)

    label = w.findChild(QLabel, "power")
    label.setText("12")
    w.show()

© www.soinside.com 2019 - 2024. All rights reserved.