2017-08-13 1 views
-1

Ich erstelle eine Anwendung, die viele CheckBoxen hat. Alle 4 CheckBoxes befinden sich innerhalb einer groupBox_n (n = 36) und diese GroupBoxen sind dann innerhalb einer anderen GroupBox.Objekte aus einer Liste aufrufen, die Objektnamen reproduziert

Jede CheckBox wird nach einer bestimmten Regel benannt, die für mich sehr praktisch ist. Ich möchte Zugang zu jedem von ihnen haben, aber ich möchte nicht jedes Mal ihren Namen eingeben. Ich habe also versucht, ihre Namen in einer Liste zu reproduzieren, so dass ich, abhängig von ihren Namen, über die Liste iterieren und die Kontrolle übernehmen konnte.

Aber wenn ich versuche, eine Schaltfläche zu verbinden, die eine Zeichenfolge aus meiner Liste aufruft, kann ich das nicht tun. Hier habe ich ein Beispiel mit einem QLineEdit reproduziert.

Ist es möglich, so etwas zu tun?

Aufruf findChildren hilft mir nicht, denn dann weiß ich nicht, was ist die Position meiner CheckBox in meiner Anwendung oder "wer ist wer" dort. Ein Aufruf über ObjectName ist ebenfalls nicht möglich, oder?

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(400, 300) 
     self.gridLayout = QtGui.QGridLayout(Form) 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 

     self.My_lineEdit = QtGui.QLineEdit(Form) 
     self.My_lineEdit.setObjectName(_fromUtf8("My_lineEdit")) 

     self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) 
     self.pushButton = QtGui.QPushButton(Form) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1) 

     MyStrinng = 'My_lineEdit' 
     QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.Mystring.clear) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Form = QtGui.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 

Wie diese PyQt nicht meine Zeichenfolge als den Namen des Objekts erkennen. Ich habe auch versucht mit QCore.QString('My_lineEdit') eine PyQt Zeichenfolge zu machen, aber QString ist nicht für meine Version (you can see here)

damit ich die Namen aller meiner Kontrollkästchen wiedergeben kann.

names = [] 

for x in range(0, 6): 
    for y in range(0, 6): 
     for z in range(1, 5): 
      Names = 's'+str(x)+str(y)+'0'+str(z) 
      names.append(Names) 
print(names) 
+1

Möchten Sie jedes Kontrollkästchen für Ihren Objektnamen abrufen? – eyllanesc

+0

Es ist wichtig, welche Box welche ist, wenn ich eine Liste bekomme. Ich wusste nicht, dass ich den Namen in der Suche angeben könnte. Vielen Dank! Glaubst du, ich kann es irgendwie mit meiner Liste von Namen vergleichen, die ich erstellt habe? Etwas wie 'für Name in Mylist: myList = parentWidget.findChild (QPushButton," Name ")' –

+0

Ja, wenn Sie können, aber erklären Sie sich besser. Entsprechend deiner Frage hast du ein Muster in den Namen, du könntest ein gültiges Beispiel für das geben, was du willst. – eyllanesc

Antwort

2

Wenn Sie ein Objekt von seinem Objekt finden möchten, ist die einfachste Option findChild() zu verwenden:

T QObject :: findChild (const QString & name = QString(), Qt :: FindChildOptions options = Qt :: FindChildrenRecursively) const

Gibt das Kind dieses Objekt, das in Typ T umgewandelt werden kann und dass wird Namen genannt, oder 0, wenn ther Es ist kein solches Objekt. Wird der Name weggelassen, werden alle Objektnamen gefunden. Die Suche wird rekursiv ausgeführt, es sei denn, Optionen geben die Option FindDirectChildrenOnly an.

Wenn mehr als ein Kind mit der Suche übereinstimmt, wird der direkteste Vorfahr zurückgegeben. Wenn es mehrere direkte Vorfahren gibt, ist es undefined welcher wird zurückgegeben. In diesem Fall sollte findChildren() verwendet werden.

Dieses Beispiel gibt ein Kind QPushButton von parentWidget „button1“ genannt, auch wenn die Taste nicht direkt Kind der Eltern ist:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1"); 

Das Beispiel in C++, die in der Dokumentation würde zu python der folgenden Form übersetzt:

button = parentWidget.findChild(QPushButton, "button1") 

In Ihrem Fall:

class Ui_Form(object): 
    def setupUi(self, Form): 
     ... 
     # change self.lineEdit to self.My_lineEdit 
     #Form is the parent of My_lineEdit      
     self.My_lineEdit = QtGui.QLineEdit(Form) 
     self.My_lineEdit.setObjectName(_fromUtf8("My_lineEdit")) 

     self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) 

     ... 

     le = Form.findChild(QtGui.QLineEdit, "My_lineEdit") 
     self.pushButton.clicked.connect(le.clear) 
Verwandte Themen