Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Wie kan mij helpen met een QT python probleem?  (gelezen 2365 keer)

Offline BaukeP

  • Lid
Wie kan mij helpen met een QT python probleem?
« Gepost op: 2010/09/23, 12:51:26 »
Ik heb het volgende probleem (en dat ligt aan mijn kennis omtrent programmeren in QT denk ik):

Ik probeer een biljart-registratie pakketje te bouwen en dat gaat tot nu toe redelijk:

Het menu:



Keuze Partij -> Invoeren:



Het scherm na bovenstaande keuze met een QSplitter:



Tot zover werkt het.

Nu heb ik een class gemaakt om het gedeelte linksboven te vullen; een begin tenminste:

class PartijRegistratie(QDialog):
    """ Hoofdscherm met menu en statusbalk """
    def __init__(self, parent=None):
        super(PartijRegistratie, self).__init__(parent)
        
        self.koptekst = QLabel("")
        self.datumLbl = QLabel("Datum:")
        self.datum = QDateEdit()
        self.datumLbl.setBuddy(self.datum)

Maar ik zie deze koptekst en label niet!

Gedeelte hoofdmodule:
class MainWindow(QMainWindow):
    """ Hoofdscherm met menu en statusbalk """
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.setWindowTitle('Biljart Competitie- en Toernooi Registratie')
        
        # Het centrale deel van het scherm
        self.centreframe = QFrame()
        self.centreframe.setMinimumSize(1200, 700)
        #self.centreframe.setAlignment(Qt.AlignCenter)
        self.setCentralWidget(self.centreframe)
        
        # De statusbar
        status = self.statusBar()
        status.setSizeGripEnabled(True)
        #status.addPermanentWidget(self.sizeLabel)
        status.showMessage("Klaar", 15000)

knip---

    @pyqtSignature("")
    def partijInvoeren(self):

        self.linksboven = partij.PartijRegistratie(self)
        self.linksboven.koptekst.setText("Partij invoeren")
#        self.linksboven = QDialog()
#        self.linksboven.setWindowFlags(Qt.SplashScreen)
#        self.koptekst = QLabel("Partij invoeren:")
#        self.datumLbl = QLabel("Datum:")
#        self.datum = QDateEdit()
#        self.datumLbl.setBuddy(self.datum)
#        self.linksboven.addWidget(dialog)
        self.rechtsboven = QTextBrowser()
        self.onder = QTableView()
        self.bovhelftSplitter = QSplitter(Qt.Horizontal)
        self.bovhelftSplitter.addWidget(self.linksboven)
        self.bovhelftSplitter.addWidget(self.rechtsboven)
        self.mainSplitter = QSplitter(Qt.Vertical)
        self.mainSplitter.addWidget(self.bovhelftSplitter)
        self.mainSplitter.addWidget(self.onder)
        self.setCentralWidget(self.mainSplitter)
        self.show()

en de code voor PartijRegistratie:
class PartijRegistratie(QDialog):
    """ Hoofdscherm met menu en statusbalk """
    def __init__(self, parent=None):
        super(PartijRegistratie, self).__init__(parent)
        
        self.koptekst = QLabel("")
        self.datumLbl = QLabel("Datum:")
        self.datum = QDateEdit()
        self.datumLbl.setBuddy(self.datum)

Dus hoe krijg ik de diverse splitters gevuld?

Het zijn probeerseltjes, maar ik kom na lang proberen en zoeken niet tot een oplossing. Mis waarschijnlijk iets principieels..... maar wat?

Wie zou zo vriendelijk willen zijn om hier zijn (of haar) licht over te laten schijnen. Dankbaarheid zou uw deel zijn!

Bauke
« Laatst bewerkt op: 2010/09/23, 16:12:46 door BaukeP »

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Re: Wei kan mij helpen met een QT python probleem?
« Reactie #1 Gepost op: 2010/09/23, 14:22:19 »
Welke IDE gebruikt je? Met QT Creator kun je die labels enzo gewoon sleuren/pleuren op je scherm...
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Offline BaukeP

  • Lid
Re: Wie kan mij helpen met een QT python probleem?
« Reactie #2 Gepost op: 2010/09/23, 16:21:31 »
Inderdaad, die heb ik geprobeerd. En dan gebeurt er zoveel achter de schermen, dat ik heb besloten de eerste tijd alles gewoon in te tikken. Ik ga er even vanuit dat ik er dan wat meer van leer. En dat is het doel waarnaar we streven. Ik heb vroeger es geprogrammeerd (nooit beroepsmatig trouwens) in een dbf georiënteerd pakket (van CA meen ik - de naam is me even ontschoten) en nu wil ik multiplatform en modern. Eens zien waar we uitkomen.

Als de structuur maar eenmaal staat (en door mij begrepen wordt) dan zijn we al een heel stuk verder.

Ik gebruik trouwens het internet en dit boek: Rapid GUI Programming with Python and Qt - The Definitive Guide to PyQt Programming (2008).
Staat heel veel in, maar ik leer liever 'by example'. En wat ik nu wil staat er niet in (kan ik niet vinden tenminste).

Bauke

Offline commandoline

  • LoCo-contact
    • marten-de-vries
    • Marten-de-Vries.nl
Re: Wie kan mij helpen met een QT python probleem?
« Reactie #3 Gepost op: 2010/09/24, 16:40:16 »
Nu heb ik een class gemaakt om het gedeelte linksboven te vullen; een begin tenminste:

class PartijRegistratie(QDialog):
    """ Hoofdscherm met menu en statusbalk """
    def __init__(self, parent=None):
        super(PartijRegistratie, self).__init__(parent)
        
        self.koptekst = QLabel("")
        self.datumLbl = QLabel("Datum:")
        self.datum = QDateEdit()
        self.datumLbl.setBuddy(self.datum)

Maar ik zie deze koptekst en label niet!
Eh, moeten die items niet gewoon in een layout worden gezet / parent=self + moven? Anders is het redelijk logisch dat ze niet weergeven worden.

Iets anders dat me opviel, was dat je binnen je MainWindow (in partijInvoeren() ) show() aanroept, terwijl je window op dat moment toch al weergeven wordt?

En ten slotte:
Je gebruikt de decorator '@pyqtSignature("")'. Ten eerste raad de PyQt4 documentatie aan om in plaats daarvan pyqtSlot te gebruiken: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#the-qtcore-pyqtsignature-decorator . Ten tweede is het meestal niet nodig om je eigen slots te defineren, maar gebruik je gewoon functies/methods binnen je class. Dus dan heb je twee opties (nieuwe en oude stijl):
button.clicked.connect(self.doSomethingWithTheClick)
self.connect(button, QtCore.SIGNAL("clicked()"), self.doSomethingWithTheClick)

Offline BaukeP

  • Lid
Re: Wie kan mij helpen met een QT python probleem?
« Reactie #4 Gepost op: 2010/09/25, 23:25:37 »
Commandoline,

Ik ben na wat geploeter inderdaad al verder. Ga kijken naar je aanwijzingen. Best mogelijk dat ik oude en nieuwe stijl door elkaar gebruik. Het is maar net wat je op het net vindt.

Ik zal in de nabije toekomst wel meer vragen hebben. Tot dan en uiteraard hartelijk dank!

Bauke

PS Ik zit inderdaad te kl*ten met parents en self ed.  Heb n og wel het één en ander te leren  :|

Offline BaukeP

  • Lid
Re: Wie kan mij helpen met een QT python probleem?
« Reactie #5 Gepost op: 2010/10/02, 13:30:34 »
Ik ben al weer een stukje verder:



Voor het gemak (en om te kijken of het werkt) heb ik in alle drie onderdelen dezelfde class aangeroepen.

De code voor de class ziet er zo uit:

class SpelerScherm(QWidget):
    """ Scherm na menukeuze Spelerbeheer """
    def __init__(self, parent=None):
        super(SpelerScherm, self).__init__(parent)
       
        #self. move (800 , 300)
        self. setWindowTitle ( " Spelerregistratie " )
       
        self.font12 = QFont("SWISS", 12)
        self.font12.setBold(True)
   
        self.tekst = ""
        self. initUI ()

    def initUI(self):
       
        self.gbox1 = QGridLayout()      # Eerst een gridbox (voor datum, seizoen etc)
       
        self.koptekst = QLabel (self.tekst)
        self.koptekst.setFont (self.font12)
        self.koptekst.setMinimumSize(QSize(250, 30))
        self.gbox1.addWidget (self.koptekst, 0, 0, 1, 2)
        self.gbox1.addWidget (QLabel ( " Naam/Init. : " ), 1, 0)
        self.hboxnaam = QHBoxLayout()
        self.naam = QLineEdit(self)
        self.naam.setMinimumSize(QSize(200, 23))
        self.hboxnaam.addWidget (self.naam)
        self.init = QLineEdit (self)
        self.init.setMaximumSize(QSize(70, 23))
        self.hboxnaam.addWidget(self.init)
        self.gbox1.addLayout(self.hboxnaam, 1, 1)
       
        self.gbox1.addWidget (QLabel (" Adres : " ), 2, 0)
        self.adres = QLineEdit (self)
        self.gbox1.addWidget (self.adres, 2, 1)
       
        self.gbox1.addWidget (QLabel (" Pcode/Woonpl. : " ), 3, 0)
        self.hboxpcode = QHBoxLayout()
        self.pcode = QLineEdit (self)
        self.pcode.setMaximumSize(70, 70)
        self.hboxpcode.addWidget (self.pcode)
        self.woonplaats = QLineEdit (self)
        self.hboxpcode.addWidget (self.woonplaats)
        self.gbox1.addLayout(self.hboxpcode, 3, 1)
       
        self.gbox1.addWidget ( QLabel ( " Telefoon : " ), 4, 0)
        self.telefoon = QLineEdit (self)
        self.gbox1.addWidget ( self.telefoon, 4, 1)
       
        self.gbox1.addWidget ( QLabel ( " Email : " ), 5, 0)
        self.email = QLineEdit (self)
        self.gbox1.addWidget ( self.email, 5, 1)
        self.horline = helper.HorLine()
        self.gbox1.addWidget(self.horline, 6, 0, 1, 2)     

        self.hboxbutton = QHBoxLayout()
        self.AnnulerenBtn = QPushButton("&Annuleren")
        self.BewarenBtn = QPushButton("&Bewaren")
        self.hboxbutton.addStretch()
        self.hboxbutton.addWidget(self.AnnulerenBtn)
        self.hboxbutton.addWidget(self.BewarenBtn)
       
        self.gbox1.addLayout(self.hboxbutton, 7, 1)
       
       
        self.gbox1.setVerticalSpacing(3)
        self.gbox1.setHorizontalSpacing(3)
               
        self.setLayout(self.gbox1)

En de aanroep van deze class zo: (met een deel van MainWindow)
class MainWindow(QMainWindow):
    """ Hoofdscherm met menu en statusbalk """
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.move(50,50)
        self.setWindowTitle('Biljart Competitie- en Toernooi Registratie')
       
        # Het centrale deel van het scherm
        self.cw = QWidget()
        self.cw.setMinimumSize(1200, 700)
        self.setCentralWidget(self.cw)
       
        # De statusbar
        status = self.statusBar()
        status.setSizeGripEnabled(True)
        status.showMessage("Klaar", 15000)
       
        self.CTBmenu = menu.hoofdmenu(self)
   
    def CTBcompN(self):
        pass
           
    def CTBcompB(self):
        pass
   
    def CTBcompH(self):
        pass
   
    def CTBtoerN(self):
        pass
           
    def CTBtoerB(self):
        pass
   
    def CTBtoerH(self):
        pass
   
    def CTBAfsluiten(self):
        pass
   
    def spelerInvoeren(self):
        # bh = bovenste helft; oh = onderste helft; lb = linksboven; rb = rechtsboven
       
        self.lb = speler.SpelerScherm(self)
        self.lb.setGeometry(0, 0, 400, 250)
        self.lb.koptekst.setText("Speler invoeren:")
       
        self.rb = speler.SpelerScherm(self)  #QTextBrowser()
       
        self.oh = speler.SpelerScherm(self)   #QTableView()
       
        self.bhSplitter = QSplitter(Qt.Horizontal)
        self.bhSplitter.addWidget(self.lb)
        self.bhSplitter.addWidget(self.rb)
        self.mainSplitter = QSplitter(Qt.Vertical)
        self.mainSplitter.addWidget(self.bhSplitter)
        self.mainSplitter.addWidget(self.oh)
        self.setCentralWidget(self.mainSplitter)

Het probleem nu:
Ik heb geprobeerd om in plaats van een Splitter 3 frames te gebruiken. Dit omdat het deel linksboven vaste afmetingen mag hebben. Daarmee wordt natuurlijk de hele splitter kwa afmetingen bevroren en kan dus net zo goed in frames o.i.d.
Ik heb van alles geprobeerd, maar kom er niet uit om het bovenstaande te veranderen in drie frames.

Graag wat hulp want alle (nog volgende schermen) in splitters lijkt me niet goed.

Alvast weer bedankt

Bauke

Offline commandoline

  • LoCo-contact
    • marten-de-vries
    • Marten-de-Vries.nl
Re: Wie kan mij helpen met een QT python probleem?
« Reactie #6 Gepost op: 2010/10/03, 17:19:27 »
Waarom pak je een frame, en niet bijv. een layout? Dat lijkt me eerder het equivalent van een niet te bewegen splitter.

Offline BaukeP

  • Lid
Re: Wie kan mij helpen met een QT python probleem?
« Reactie #7 Gepost op: 2010/10/27, 23:48:05 »
Commandoline, excuses voor het late antwoord.

Ga layout proberen!

Bedankt,

Bauke