Dynamisch erzeugte QPushButton - Wert auslesen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
blck
User
Beiträge: 11
Registriert: Sonntag 17. Juli 2011, 00:37

Hallo,
ich erzeuge mit folgendem Code während der Laufzeit des Programmes QPushButtons, bzw Objekte der Klasse QPushButton. Newsseiten ist dabei eine Liste, in der folgendes steht:
[(u'Spiegel-Online',), (u'N-TV',), (u'MeeGo',), (u'engadget',)]
Der Code:

Code: Alles auswählen

    for name in newsseiten:
        button = QtGui.QPushButton(name[0],fenster_global.ui)
        button.move(200, ausgang)
        button.setObjectName(name[0])
        button.clicked.connect(setRessorts)
        button.show()
        ausgang = ausgang+100
        print name[0]
    global newsseiten

def setRessorts():
    print newsseiten
    fenster_global.ui.stackedWidget.setCurrentIndex(5)
Jetzt mein Problem:
Das erzeugen der Button klappt wunderbar, und auch das verbinden der Button mit der Funktion setRessorts. Mein Problem ist jetzt, dass ich in der setRessorts-Funktion wissen müsste, welcher Butto gedrückt wurde. Ich hatte gehofft irgendwie über den Objekt-Namen zugreifen zu können, da jeder Button ja anders benannt sein müsste. Leider weiß ich jetzt aber nicht, wie tatsächlich an den Objekt-Namen (der würde mir reichen) heran komme?

EDIT: Die Funktion sender() ist hier mein Freund. Teil 1 gelöst. Siehe Teil 2 unten für meine zweite Frage:

Desweiteren müsste ich die Objekte, nachdem einer der Button gedrückt wurde, wieder zerstören, sprich die Liste newsseiten wieder abarbeiten und die Objekte löschen, auch hier fehlt mir aber der Ansatz. Bin also für Hilfe dankbar.

MfG Blck
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

`functools.partial` ist hier Dein Freund. Schau mal hier rein.

Du solltest Dir übrigens mal dringend einen Layoutmanager angucken. Widgets absolut zu positionieren sollte heutzutage ein no go sein :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
blck
User
Beiträge: 11
Registriert: Sonntag 17. Juli 2011, 00:37

Hallo,
danke für deine Antwort. Hatte das jetzt über die sender()-Funktion gelöst. Mein Problem ist jetzt wie ich die erstellten Objekte wieder verschwinden lasse, da selbst wenn ich sie an das stackedWidget binde, sprich

Code: Alles auswählen

button = QtGui.QPushButton(name[0],fenster_global.ui.stackedWidget)
ausführe und dann eine neue Seite öffne, die Buttons immer noch zu sehen sind!

MfG Blck

EDIT:
Zu dem Layout-Manager. Ich binde die Button ja an mein stackedWidget (siehe Code unten) und versuche jetzt auch das Layout zu erzeugen. Ich sehe leider immer nur einen Button, obwohl i sich ja erhöht. Ein kleiner Schubser in die richtige Richtung wäre nett :)

Code: Alles auswählen

 #Liste mit str(newsseite)n
    newsseiten = cursor.fetchall()
    connection.close()

    #Layout konfigurieren
    grid = QtGui.QGridLayout()
    grid.setParent(fenster_global.ui.stackedWidget)
    i = 0
    
    ausgang = 200
    for name in newsseiten:
        button = QtGui.QPushButton(name[0],fenster_global.ui.stackedWidget)
        button.setObjectName(name[0])
        grid.addWidget(button,0,i)
        #button.setGeometry(QtCore.QRect(140, ausgang, 200, 100))
        button.clicked.connect(setRessorts)
        button.show()
        ausgang = ausgang+100
        print i
        i = i+1
    fenster_global.ui.stackedWidget.setLayout(grid)
EDIT2: Hat sich erstmal alles erledigt. Danke für eure Hilfe und das stoßen auf das GridLayout!
Antworten