Neues Fenster erzeugen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

Okay sry
hier mal der ganze code

Code: Alles auswählen

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        
        exit = QtGui.QAction('Quit', self)
        settings=QtGui.QMenu("Settings", self)
        
        self.resize(800, 400)
        self.setWindowTitle(str('Settings'))
        
        menubar = self.menuBar()
        
        file = menubar.addMenu('&Options')
        file.addAction(settings)
        file.addAction("Help")
        file.addAction("About")
        file.addAction(exit)
        
        settings.triggered.connect(self.settings)
        exit.triggered.connect(self.close)
        
    def settings(self):
        self.settings = QtGui.QWidget(self)
        self.settings.show()
        
        
app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
Wie mit einem Slot verbinden?
Muss ich doch bei exit auch nicht machen und es klappt


@BlackJack

Müsste ich dann die Methode umbenennen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das ganze ist ja nicht mal ausführbar! Den Fehler hättest Du doch längst posten können! :roll:
Robokopp hat geschrieben:

Code: Alles auswählen

        # So ist es richtig
        exit = QtGui.QAction('Quit', self)
        # Das ist KEINE QAction!
        settings=QtGui.QMenu("Settings", self)
        
        # wozu das hier?      
        menubar = self.menuBar()
        
        # file ist kein guter Name, in diesem Zusammenhang eh nicht
        file = menubar.addMenu('&Options')
        # wäre settings eine QAction, wäre das richtig!
        file.addAction(settings)
        file.addAction(exit)
        # prinzipiell richtig, wenn settings eine QAction wäre        
        settings.triggered.connect(self.settings)
        # Genau HIER verbindest Du die Aktion doch mit einem SLOT!!!
        exit.triggered.connect(self.close)
        
    def settings(self):
        # Hier solltest Du imho einen Dialog nutzen.
        self.settings = QtGui.QWidget(self)
        self.settings.show()
        
        
app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
Wie mit einem Slot verbinden?
Muss ich doch bei exit auch nicht machen und es klappt
Doch! Siehe Kommentare im Code
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Vielleicht noch ein kleiner Tipp: Mit dem QtDesigner kannst Du die Menüs bereits komfortabel anlegen und die Actions definieren. Lediglich das connecten auf eigene Slots musst Du dann später manuell vornehmen. Standard-Slots wie "close" kannst Du sogar auch schon im Designer mit einer Action verbinden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

ja schon, aaber

wenn ich nun settings = QtGui.QAction("settings", self) verwende, geht es genauso wenig.

Hatte das vorher so, aber dann dachte ich es liegt wohl an QAction, weil ich immer einen Fehler mit "QAction" bekommen habe, weswegen ich das geändert habe

das menubar = self.menuBar() habe ich aus irgendeinem Example entnommen, genauso wie die Bezeichnung "File"



LOL: Es geht auf einmal, aber ich weiß jetzt nicht warum. Hab das eigentlich genauso wie vorher...


Naja mit dem Designer kann ich zur Zeit noch garnix anfangen.Da fehlen mir irgendwie noch die Zusammenhänge

Ich will mir erstmal die Basics aneignen, um zu sehen, wie das alles funktioniert

Edit:Nächstes Problem

Ich habe ein paar Buttons im erzeugten QDialog erstellt.Die werden nicht angezeigt und Windowresize klappt auch nicht
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Robokopp hat geschrieben: wenn ich nun settings = QtGui.QAction("settings", self) verwende, geht es genauso wenig.

Hatte das vorher so, aber dann dachte ich es liegt wohl an QAction, weil ich immer einen Fehler mit "QAction" bekommen habe, weswegen ich das geändert habe.
Man kann ja trotz korrekter Klassen durchaus noch Fehler machen, aber "planloses" Ändern nach "Trial & Error" ist beim Programmieren selten zielführend. Du solltest Dir dann besser mal die Dokumentation angucken, oder Code-Schnipsel, die so etwas zeigen. Bei dem hättest Du Dir auch mal ein Beispiel im Desigber bauen können, das ui-File manuell per pyuic in eine Python-Datei wandeln und Dir angucken, wie die Jungs von Pyqt das "lösen".
das menubar = self.menuBar() habe ich aus irgendeinem Example ...
Vielleicht hatte es da auch Sinn! Hier ist es doch sinnlos, da Du doch nur eine Objektvariable an einen lokalen Namen bindest.

Code: Alles auswählen

menubar = self.menuBar()
file_menu = menubar.addMenu('&Options')
# ist doch so einfacher
file_menu = self.menuBar().addMenu('&Options')
... entnommen, genauso wie die Bezeichnung "File"
Dann war dieses Beispiel nicht gut ;-) (Kann ja auch ein C++ Beispiel gewesen sein?). Achte einfach darauf, dass man built-ins am besten nicht überschreibt. Viele Editoren mit Syntax-Highlighting bieten ja sogar spezielle Hervroherbungen für built-ins. Gibt auch Tools, die so etwas prüfen: http://pychecker.sourceforge.net/ (Man hat ja tatsächlich nicht immer alles im Kopf)
Naja mit dem Designer kann ich zur Zeit noch garnix anfangen.Da fehlen mir irgendwie noch die Zusammenhänge

Ich will mir erstmal die Basics aneignen, um zu sehen, wie das alles funktioniert
Prinzipiell auch eine gute Idee! Aber wie ich es oben beschrieb, kann einem der Designer da durchaus ja auch Hilfen geben, wie oben beschrieben beispielsweise.

Ich kann Dir auf jeden Fall auch mal die Snippet-Seite von lunar empfehlen; da findet man viel nützliches :-)
https://bitbucket.org/lunar/snippets/src
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

Ich hab mich bisweilen an den Examples von PyQt orientiert, was mich auch schon erheblich weitergebracht hat und an einigen Programmen^^
Ich habe mir jetzt mal DropN900 heruntergeladen, denn da ist es genauso, wie ich es haben will.

Code: Alles auswählen

menubar = self.menuBar()
file_menu = menubar.addMenu('&Options')
# ist doch so einfacher
file_menu = self.menuBar().addMenu('&Options')
Stimmt, es ist wirklich einfacher.Aber so ganz sinnlos ist die von mir verwendete Schreibweise doch nicht


Ich verwende Eclipse mit PyDev und habe PyQt da integriert.Das Syntax-Highlighting klappt soweit recht gut :)
Ne es war ein Pythonbeispiel aus den Examples, doch ich weiß nicht mehr genau welches


Danke für die Seite, klingt vielversprechend
Antworten