Projekt Meisterhilfe

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
BlackJack

@feldmann_markus: Ich habe doch gesagt was Du falsch gemacht hast, Du hast OOP nicht so ganz verstanden. ;-)

Wobei der Unterschied zwischen Funktion übergeben oder Funktion aufrufen und Rückgabewert übergeben in C++ genau der gleiche ist. Sogar syntaktisch.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:@feldmann_markus: Deine letzte Zeile 17 ist ja noch "fälscher". Jetzt rufst Du die Methode nicht nur auf, sonder gibst ihr auch noch ein Argument mit, dass sie gar nicht erwartet.
Stimmt. War ein grober Fehler von mir.
Aber was ich nicht verstehe ist warum ich folgendes schreiben darf,

Code: Alles auswählen

        self.connect(self.workspace, SIGNAL("clicked()"),
                            self.updateMenus)
aber nicht,

Code: Alles auswählen

        self.connect(self.workspace, SIGNAL("clicked()"),
                            self.updateMenus())
Im zweiten Beispiel wird doch kein Argument übergeben?
Und das "None" übergeben wird, wird wohl eher nur in Python der Fall sein, denke ich?!
Werde es mir fürs nächste mal merken. :-)
BlackJack

Im zweiten Fall wird die Methode *aufgerufen* und `None` wird nicht übergeben, sondern von der Methode zurückgegeben.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:Im zweiten Fall wird die Methode *aufgerufen* und `None` wird nicht übergeben, sondern von der Methode zurückgegeben.
:idea: :roll: :idea: Verstanden :D
Und im ersten Fall nicht? Da werde ich nochmal im Python Buch nachlesen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

feldmann_markus hat geschrieben:Und im ersten Fall nicht? Da werde ich nochmal im Python Buch nachlesen.
Da wird nur die Referenz übergeben. Kannst du auch ganz einfach im Interpreter ausprobieren, tippe einfach mal ``print list`` und ``print list()`` ein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ich habe mein Programm mittels einer Beispiel Vorlage ein wenig voran gekurbelt. :-)

Mein Hauptfenster ist eine MDI Anwendung, in denen Unterfenster erscheinen können. Nun wollte ich das man diese Unterfenster immer nur einmal erscheinen lassen kann. Ich erstelle also ein Unterfenster Reisehelfer der über die selbst erstellte Action reisehelferAct angestoßen wird.

Code: Alles auswählen

...
        self.reisehelferAct = QtGui.QAction(QtGui.QIcon(":/images/cut.png"),
                        self.tr("&Reiserhelfer"), self)
        self.reisehelferAct.setShortcut(self.tr("Ctrl+Alt+R"))
        self.reisehelferAct.setStatusTip(self.tr("Startet das Reisehelfer Modul."))
        self.connect(self.reisehelferAct, QtCore.SIGNAL("triggered()"), self.createReisehelfer)
...
und hier die Methode zum erstellen des Fensters,

Code: Alles auswählen

    def createReisehelfer(self):
        ReiseHelferFenster = ReiseHelfer()
        if not ReiseHelferFenster.isVisible:
            self.workspace.addWindow(ReiseHelferFenster)
            ReiseHelferFenster.show()
        else:
            pass
Irgendwie funktioniert das nicht. Hat Jemand ne Idee?
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

feldmann_markus hat geschrieben: Irgendwie funktioniert das nicht. Hat Jemand ne Idee?
Ich weiss, dass ich das Objekt zu fassen bekommen muß, was in meiner Methode oben nicht der Fall ist. Nur wie schaffe ich das ?
Gibt es eine Funktion, mit der ich überprüfen kann ob es ein Objekt mit dem Fenster Titel "Reisehelfer" gibt, welches zur workspace gehört?
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

feldmann_markus hat geschrieben: Gibt es eine Funktion, mit der ich überprüfen kann ob es ein Objekt mit dem Fenster Titel "Reisehelfer" gibt, welches zur workspace gehört?
Habe nun eine Methode erstellt mit der ich das fast kann,

Code: Alles auswählen

    def existUnterfenster(self,Title):
    	for window in self.workspace.windowList():
            print window.windowTitle
            if Title == window.windowTitle:
                return True
            else:
                pass
        return False
Dafür mußte ich meine Methode ein wenig anpassen,

Code: Alles auswählen

    def createReisehelfer(self):
        ReiseHelferFenster = ReiseHelfer()
        # Wenn das Fenster schon existiert darf es nicht nochmal
        # erzeugt werden.
        if not self.existUnterfenster("Reisehelfer"):
            self.workspace.addWindow(ReiseHelferFenster)
            ReiseHelferFenster.show()
        else:
            pass
Leider ist hier noch ein Fehler drinne.
In meiner Konsole spuckt er nur aus,
  • <built-in method windowTitle of ReiseHelfer object at 0xb7bbf6ac>
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

feldmann_markus hat geschrieben: Gibt es eine Funktion, mit der ich überprüfen kann ob es ein Objekt mit dem Fenster Titel "Reisehelfer" gibt, welches zur workspace gehört?
Nun funktioniert es,

Code: Alles auswählen

    def createReisehelfer(self):
        ReiseHelferFenster = ReiseHelfer()
        # Wenn das Fenster schon existiert darf es nicht nochmal
        # erzeugt werden.
        if not self.existUnterfenster("Reisehelfer"):
            self.workspace.addWindow(ReiseHelferFenster)
            ReiseHelferFenster.show()
        else:
            pass
    
    def existUnterfenster(self,Title):
    	for window in self.workspace.windowList():
            print window.windowTitle()
            if Title == window.windowTitle():
                return True
            else:
                pass
        return False
BlackJack

Was soll denn dieses ``else: pass`` immer?
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:Was soll denn dieses ``else: pass`` immer?
Gute Idee, laß ich ab sofort einfach weg. :-)
Ist ne schlechte Angewohnheit von mir mit "else".
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Neues Problem.

Ich bin dabei mit der QSettings rum zu spielen, also das speichern der Fenster Einstellungen.
Bei meinem Hauptfenster(Mdi) klappt das, allerdings nicht bei meinem Unterfenster(Mdi Child).

Gibt es eine Gesamtübersicht aller Signale?
Ich will dass das Unterfenster beim schliessen seine Größe und Position speichert über QSettings genau wie beim Hauptfenster.
Was mache ich falsch?
Kann mir einer erklären, was Zeile 23 und 24 in hauptfenster.py bewirken?

Hier ein Ausschnitt meiner aktuellen Sourcen,
Hauptfenster,

Code: Alles auswählen

#!/usr/bin/env python
#
#hauptfenster.py
#

import sys
from PyQt4 import QtCore, QtGui
from reisehelfer import *


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        
        self.workspace = QtGui.QWorkspace()
        self.setCentralWidget(self.workspace)
        
        self.connect(self.workspace, QtCore.SIGNAL("windowActivated(QWidget *)"), 
                     self.updateMenus)
        self.windowMapper = QtCore.QSignalMapper(self)
        self.connect(self.windowMapper, QtCore.SIGNAL("mapped(QWidget *)"),
                     self.workspace, QtCore.SLOT("setActiveWindow(QWidget *)"))
        
        self.createActions()
        self.createMenus()
        self.createStatusBar()
        self.updateMenus()

        self.readSettings()

        self.setWindowTitle(self.tr("DSA 4 Meisterhilfe"))
        
...

und Unterfenster,

Code: Alles auswählen

#!/usr/bin/env python
#
#reisehelfer.py
#

import sys
from PyQt4 import QtCore, QtGui


class ReiseHelfer(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        
        self.connect(self, QtCore.SIGNAL("close(QWidget *)"), self.writeSettings)
        
        self.setWindowTitle(self.tr("Reisehelfer"))

        self.readSettings()

...

Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie wäre es, wenn du statt jedes deiner Probleme hier anzuhängen du einen neuen Thread aufmachen würdest, dass auch andere unter Umständen davon profitieren könnten? Ein Thread pro Problem ist durchaus erwünscht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Leonidas hat geschrieben:Ein Thread pro Problem ist durchaus erwünscht.
Absolut kein Problem. Wahrscheinlich auch übersichtlicher.
Antworten