Checkboxes in QT

Alles rund um die Programmierung mit Qt
sublist
Beiträge: 11
Registriert: 27. April 2012 14:13

Checkboxes in QT

Beitrag von sublist »

Hallo Leute.

Ich versuche zum ersten Mal ein UI mit QT zu basteln.
Das ganze soll in Maya 2012 laufen.
Ich bin soweit, daß alles richtig angezeigt wird und möchte nun die Funktionen connecten.
Leider hab ich erstens nicht so viel Ahnung von OOP Programmierung und von QT gar nicht.
Ich hab mir aus Tutorials alles zusammengeklaut und versuche das nun auf mein UI zu adaptieren.
Das Problem was ich habe sind die QCheckBoxes. Ich bekomme die nicht zum laufen.
Das hier habe ich mir zwar durchgelesen, verstehe ich aber nicht.
http://qt-project.org/doc/qt-4.8/signalsandslots.html

Desweiteren hab ich in meiner UI eine QListWidget die mit Werten aus einer Arrayliste gefüllt werden soll.
Damit hab ich mich jetzt noch gar nicht beschäftigt...

So sieht der Code momentan aus:

Code: Alles auswählen

import re
from pymel.core import *
from PyQt4 import QtGui, QtGui, uic

#Path to UI File
ui_filename = 'e:/My Dropbox/QT_Projects/HighScoreList.ui' #pfade checken!!!
form_class, base_class = uic.loadUiType(ui_filename)

#Interface Class
class Interface(base_class, form_class):
    def __init__(self):
        super(base_class, self).__init__()
        self.setupUi(self)
        self.setObjectName('Highscorelist')
        self.setDockNestingEnabled(True)
        self.Establish_Connections()
    def createBox_fn(self):
        polyCube()
    def Establish_Connections(self):
        QtCore.QObject.connect(self.recordBox, QtCore.SIGNAL("stateChanged(int)"),self.createBox_fn)

#Main
def main():
    global ui
    ui = Interface()
    ui.background.setPixmap(QtGui.QPixmap('e:/My Dropbox/QT_Projects/logo_dummy.jpg')) #Add Image to Object "Background"
    ui.show()

    # Make Window dockable
    '''
    if dockControl('ui_dock', q=1, ex=1):
        deleteUI('ui_dock')
    floatingLayout = paneLayout(configuration='single', width=213) #Size of Main Window
    allowedAreas = ['left', 'right']
    docControl = dockControl('ui_dock', area=allowedAreas[1], content=floatingLayout, label='Highscorelist')
    control('Highscorelist', e=True, p=floatingLayout)
    '''

if __name__ == "__main__":
    main()
Es wäre Super, wenn jemand geduldiges etwas Licht ein meinen dunklen Kopf bringen könnte.

Danke! :)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Checkboxes in QT

Beitrag von franzf »

sublist hat geschrieben:Das Problem was ich habe sind die QCheckBoxes. Ich bekomme die nicht zum laufen.
Das hier habe ich mir zwar durchgelesen, verstehe ich aber nicht.
http://qt-project.org/doc/qt-4.8/signalsandslots.html
"Nicht zum laufen" bekommen ist keine wirklich hilfreiche Beschreibung deines Problems. Geht es dir wirklich nur um die Connections? Denn in deinem Code steht bereits eine, und die scheint korrekt zu sein. (Es ist heiß heute, ich kann mich da durchaus irren :D)

Auch ist es schonmal schön, dass du Code postest - nur leider sehe ich nichts relevantes zu deinem Problem. Ist "recordBox" deine Checkbox?
Generell: Wenn du Code postest, sollte man die involvierten Typen ersehen können, da macht sich ein .ui immer schlecht. Am besten bastelst du dir ein kleines Beispielprogramm zusammen, in dem du ohne Designer (also nur mit Code) deine GUI erstellst. Möglichst minimal und auf das Problem zugeschnitten.
sublist
Beiträge: 11
Registriert: 27. April 2012 14:13

Re: Checkboxes in QT

Beitrag von sublist »

Hallo franf.

Danke fürs lesen.
Ja, recordBox ist eine meiner Checkboxen.
Momentan sendet er egal welchen Zustand die Checkbox hat ein Signal was auch funktioniert. Die Funktion "createBox_fn" wird bei jedem Klick ausgeführt
Ich würde nun gerne den on/off Zustand der Checkbox mit versch, Funktionen belegen. Daran scheiterts gerade bei mir...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Checkboxes in QT

Beitrag von franzf »

Das SIGNAL stateChanged sendet einen Parameter mit, der den neuen State (->Qt::CheckState) enthält. Dein SLOT (createBox_fn) muss jetzt auch einen Parameter bekommen. In dem SLOT fragst du dann (if/switch), wie der State jetzt ausschaut, und rufst die entsprechende Funktion auf.
sublist
Beiträge: 11
Registriert: 27. April 2012 14:13

Re: Checkboxes in QT

Beitrag von sublist »

Hallo franzf.

So ähnlich hatte ich mir das auch vorgestellt.
Kannst du mir vielleicht ein syntax beispiel mit pseudo Code geben?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Checkboxes in QT

Beitrag von franzf »

Anstatt

Code: Alles auswählen

def createBox_fn(self):
        polyCube()
einfach

Code: Alles auswählen

def createBox_fn(self, state):
  if state == 0:
    polyCube()
  elif state == 1:
    polyLine()
  else:
    polyGlott()
sublist
Beiträge: 11
Registriert: 27. April 2012 14:13

Re: Checkboxes in QT

Beitrag von sublist »

Ok. Sieht logisch aus.

Wie übegebe ich dann noch den State "Qt::CheckState" an meine Funktion "createBox_fn"?
Muss ja irgendwo hier passieren, oder?

Code: Alles auswählen

def Establish_Connections(self):
        QtCore.QObject.connect(self.recordBox, QtCore.SIGNAL("stateChanged(int)"),self.createBox_fn)
Momentan hab ich auch das Problem das ich diese Fehlermeldung bekommen.
Ich weis, daß es schon mal lief. Kann es jetzt nicht mehr nachvollziehen warum es nicht mehr geht.

Code: Alles auswählen

global name 'QtCore' is not defined
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Checkboxes in QT

Beitrag von franzf »

Das Übergeben übernimmt Qt für dich. Irgendwo im QCheckBox-Code wird eine Zeile ala

Code: Alles auswählen

emit stateChanged(Qt::Checked);
stehen. Nun wird geschaut, ob evtl. per Qt::DirectConnection angeschlossene SLOTS existieren und diese ausgeführt. QueuedConnections werden in die EventQueue gepackt und im nächsten Laufen der EventLoop abgearbeitet (wie gesagt: alles automatisch, du musst nichts tun außer zu connecten).
Da du wohl nicht mit Threads oder absichtlich mit QueuedConnections arbeitest, hast du eine DirectConnection.

In jedem Fall musst du tatsächlich nichts weiter ändern als deine Funktion createBox_fn.

BTW. gibt es in PyQt4 eine schönere (pythonischere) Art zu connecten:

Code: Alles auswählen

self.recordBox.stateChanged.connect(self.createBox_fn)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Checkboxes in QT

Beitrag von franzf »

sublist hat geschrieben:Momentan hab ich auch das Problem das ich diese Fehlermeldung bekommen.
Ich weis, daß es schon mal lief. Kann es jetzt nicht mehr nachvollziehen warum es nicht mehr geht.

Code: Alles auswählen

global name 'QtCore' is not defined

Code: Alles auswählen

from PyQt4 import QtCore
Aber mit der o.g. schöneren Art zu connecten erübrigt sich das sowieso.
sublist
Beiträge: 11
Registriert: 27. April 2012 14:13

Re: Checkboxes in QT

Beitrag von sublist »

Super, es funktioniert! Das war ja dann doch einfach.
Hatte immer versucht den Checkbox Status abzufragen und zu übergeben.
Die "pythonischere" Schreibweise liegt mir auch mehr.

Tausend Dank für dein Hilfe! Hat mir weitergeholfen

Auch auf die Gefahr hin deine Nerven zu strapazieren....wie gehe ich das Problem mit der Liste an?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Checkboxes in QT

Beitrag von franzf »

sublist hat geschrieben:wie gehe ich das Problem mit der Liste an?
Bitte die Frage so formulieren, dass dein Problem ersichtlich wird. Auch ein wenig Code (deiner bisherigen Versuche) wäre nicht schlecht.
sublist
Beiträge: 11
Registriert: 27. April 2012 14:13

Re: Checkboxes in QT

Beitrag von sublist »

Code hab ich noch keinen, aber ich versuchs mal zu erklären.

In meinem UI hab ich eine "QListWidget" mit 10 Feldern.
Diese Felder möchte ich jeweils mit nem String aus ner Python Liste füllen, die irgendwo generiert wird.

d.h.
Listindex 0 soll zu QListIndex0 kopiert werden
Listindex 1 soll zu QListIndex1 kopiert werden
usw...

ich hoffe ich konnte mich verständlich ausdrücken... :shock:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Checkboxes in QT

Beitrag von franzf »

Du musst einfach über die Elemente deines Arrays iterieren (for item in item_list:), und dann über die Methoden, die dir QListWidget bietet, diese einfügen.
Z.B. mit http://www.riverbankcomputing.co.uk/sta ... #addItem-2
Je nach Bedarf musst du vorher noch das ListWidget leeren.
sublist
Beiträge: 11
Registriert: 27. April 2012 14:13

Re: Checkboxes in QT

Beitrag von sublist »

Super Danke. Das hilft mir schon weiter!

Hab bis jetzt immer in der normalen QT Hilfe nachgeschaut und wenig gefunden
Scheint sinnvoller in der pyQT Doc zu suchen...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Checkboxes in QT

Beitrag von Christian81 »

sublist hat geschrieben: Scheint sinnvoller in der pyQT Doc zu suchen...
Aha... gut dass die Doku aus den gleichen Quellen generiert wird *g*
Siehe http://doc.trolltech.com/4.7/qlistwidget.html#addItem-2
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten