【问题标题】:Find a QLabel by its name and use setText() function按名称查找 QLabel 并使用 setText() 函数
【发布时间】:2019-03-21 10:20:00
【问题描述】:

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

我想要做的是在 QGridLayout 中找到一个 QLabel,方法是导入一个 .txt 文件并读出名称和值。 例如: power 5

现在我需要找到名为 "power_fw" 的 QLabel 来将此标签的文本设置为 "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

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

【问题讨论】:

  • 你的意思是self.ui.findChild(QLabel, talent_now).setText(talent[1]) 不起作用?
  • 给我们更多信息。这是类中的常规方法吗?在这种情况下,您将缺少 self 作为参数 (def set_value(self, talent):) 和 ui 的实例 (self.ui.talent_now...)。按照您编写的方式,您的函数 set_value 位于全局范围内(因此期望 ui 等同于 App.ui,或者您决定调用 UI 实例的任何内容)并且您在定义之前调用它。这是您尝试运行代码的方式吗?

标签: python qt pyqt5 qlabel qtwidgets


【解决方案1】:

您可以使用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()

【讨论】:

    【解决方案2】:

    您始终可以遍历布局项并检查每个小部件 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())
    

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 2023-03-17
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多