Изменение текста QLabel для многих QLabels

Я использую Python 3 и Qt5. Я разработал QWidget с чуть более чем 700 QLabels. Мне нужно изменить их, но я хотел бы сделать это без необходимости писать более 700 строк, чтобы установить текст для всех моих меток. Мне также нужно показывать и скрывать их по желанию.

Есть ли способ сгруппировать их или отредактировать переменную, если у меня есть строка с именем этой переменной? Я ищу что-то вроде функции назначения Matlab.

Этикетки называются label_A - label_Z и label_AA - label_ZZ.

Из основного класса импортировать ezodf

self.ui = AnalysisGui.Ui_Form()
self.ui.setupUi(self)

self.Alphabet = ["a", "b", "c", "d", "e",
                 "f", "g", "h", "i", "j",
                 "k", "l", "m", "n", "o",
                 "p", "q", "r", "s", "t",
                 "u", "v", "w", "x", "y", "z"]

for Alpha in self.Alphabet:
    self.ui.findChild(QtGui.QLabel, "label_"+Alpha.upper()).SetText(Alpha.upper()+" ")
    for Beta in self.Alphabet:
        self.ui.findChild(QtGui.QLabel, "label_"+Alpha.upper()+Beta.upper()).SetText(Alpha.upper()+Beta.upper()+" ")

Это из класса AnalysisGui, показывающего, как определяются метки.

self.label_A = QtGui.QLabel(Form)
self.label_A.setStyleSheet(_fromUtf8("color: rgb(0, 0, 0);\n""font: 8pt \"Calibri\";\n""background-image: url(:/Thoth/SeeThrough.png);"))
self.label_A.setObjectName(_fromUtf8("label_A"))
self.gridLayout.addWidget(self.label_A, 1, 0, 1, 1)
self.label_B = QtGui.QLabel(Form)
self.label_B.setStyleSheet(_fromUtf8("color: rgb(0, 0, 0);\n""font: 8pt \"Calibri\";\n""background-image: url(:/Thoth/SeeThrough.png);"))
self.label_B.setObjectName(_fromUtf8("label_B"))
self.gridLayout.addWidget(self.label_B, 1, 1, 1, 1)
self.label_C = QtGui.QLabel(Form)
self.label_C.setStyleSheet(_fromUtf8("color: rgb(0, 0, 0);\n""font: 8pt \"Calibri\";\n""background-image: url(:/Thoth/SeeThrough.png);"))
self.label_C.setObjectName(_fromUtf8("label_C"))
self.gridLayout.addWidget(self.label_C, 1, 2, 1, 1)

Спасибо за вашу помощь.


person Lex    schedule 25.05.2013    source источник
comment
Можете ли вы предоставить более подробную информацию? Какова ваша схема именования лейблов? Они все в одном родительском контроле или в какой-то сложной структуре?   -  person Oleh Prypin    schedule 25.05.2013
comment
Я добавил структуру именования выше. Я не создавал их явно с родительским контролем, но если это значение по умолчанию в pyqt4, то оно есть.   -  person Lex    schedule 26.05.2013
comment
Но как вы создавали этикетки?   -  person Oleh Prypin    schedule 26.05.2013
comment
Я создал их в Qt Designer... Потребовалось немного времени.   -  person Lex    schedule 26.05.2013
comment
как скрыть и показать QLabel в одном и том же месте сетки?   -  person Ejaz    schedule 27.07.2014


Ответы (1)


Вы можете попробовать использовать QWidget.findChild

import sys
from PyQt4.QtGui import *
try:
    from PyQt4.QtWidgets import *
except ImportError:
    pass


app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()

for i in range(26):
    title = chr(ord('A')+i)
    label = QLabel(title, window)
    label.setObjectName("label_"+title)
    layout.addWidget(label)

window.findChild(QLabel, "label_F").setText("test")

window.setLayout(layout)
window.show()

app.exec_()
person Oleh Prypin    schedule 25.05.2013
comment
Я не знаю, если я сделал что-то не так, но это не сработало для меня. Я получаю: AttributeError: объект «Ui_Form» не имеет атрибута «findChild», в строке: self.ui.findChild(QtGui.QLabel, label_+Alpha.upper()).SetText(Alpha.upper()+) - person Lex; 31.05.2013
comment
@Lex Может быть, вы можете просто использовать getattr(self.ui, "label_"+Alpha.upper()).setText(Alpha.upper()+" ") ... Завтра я более подробно изучу вашу проблему, теперь, когда я знаю, что вы используете эту штуку ui. - person Oleh Prypin; 31.05.2013