About Fenster öffnen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Hallo,

ich bin relativ neu in der Python Programmierung. Ich habe mir ein kleines Programm mit Qt erstellt. Jetzt wollte ich, wenn man auf den Menüpunkt About klickt, dass sich ein kleines Fenster wie bei anderen Programmen öffnet, wo dann die wichtigsten Informationen drinnen stehen. Leider stehe ich gerade total auf dem Schlauch und weiß nicht, wie ich das am besten machen kann.

Code: http://pastebin.com/e7GKRXaF
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

QMessageBox besitzt eine about Funktion. Das wäre die einfachste Variante.
http://doc.qt.io/qt-4.8/qmessagebox.html#about

Du kannst natürlich auch einfach ein eigenen Dialog bzw. ein eigenes Fenster erstellen und dann (modal) anzeigen, wenn der User auf "About" klickt.
BlackJack

@beli3ver: Das Programm enthält einen Syntaxfehler ziemlich am Ende. Die `newContactWindow()`-Funktion sieht auch aus als hätte da jemand mitten in einem Namen aufgehört zu schreiben. Es darf auch nur ein `QApplication`-Exemplar pro Programm erstellt werden, denn dieses Objekt stellt *das* Programm aus Qt-Sicht dar.

Auf Modulebene gibt es keinen Namen `app`. Steigst Du eventuell mit Qt-Programmierung ein, ohne die Python-Grundlagen verinnerlicht zu haben? Funktionen, Klassen, Namensräume/Gültigkeits- und Sichtbarkeitsbereiche von Namen sind wichtig und gelten unabhängig von Qt in allen Python-Programmen gleich. Falls Du noch kein Grundlagentutorial durchgearbeitet hast, solltest Du das nachholen. Mindestens parallel zu dem Projekt was Du umsetzen möchtest.

Klassennamen fangen mit einem Grossbuchstaben an. Wirf mal einen Blick in den Style Guide for Python Code. Der gilt bei GUI-Rahmenwerken deren Namen sich nicht an diese Richtlinien halten weil die Namen dort von einer anderen Programmiersprache kommen (bei Qt ist das C++) nicht so strikt und uneingeschränkt für den Code der das Rahmenwerk verwendet, aber in der Programmlogik sollte man sich auch in solchen Programmen dann wieder an die Python-Konventionen halten. Bei Klassennamen sind sich die Konventionen von Python und Qt aber einig: nicht mit Kleinbuchstaben anfangen. Denn dann bekommt man Probleme wie man ein Exemplar von der Klasse `mainWindow` nennen soll, weil man die nicht `mainWindow` nennen kann. Wenn die Klasse `MainWindow` heisst, dann kann man das aber. Auf jeden Fall sollte man es nicht `ex` nennen, wo der Leser dann rätseln darf ob das für `example`, `exemplar`, oder ganz was anderes stehen mag. :-)

Das Hauptfenster sollte sich beim Initialisieren nicht selber anzeigen. Das macht kein anderes Widget, weil man damit dem Aufrufer die Freiheit nimmt die Entscheidung zu treffen ob und wann das Widget angezeigt werden soll.

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
import sys
from PyQt4 import QtGui


class MainWindow(QtGui.QMainWindow):
    
    def __init__(self):
        super(MainWindow, self).__init__()
                
        newAction = QtGui.QAction(
            QtGui.QIcon('images/file_new.png'), '&New', self
        )
        newAction.setShortcut('Ctrl+N')
        newAction.setStatusTip('Create new entry')

        exitAction = QtGui.QAction(
            QtGui.QIcon('images/exit.png'), '&Exit', self
        )
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(QtGui.qApp.quit)

        infoAbout = QtGui.QAction(QtGui.QIcon('images/star.png'), 'About', self)
        infoAbout.setStatusTip('All infos about this project')
        infoAbout.triggered.connect(self.on_about)
        infoLicence = QtGui.QAction(
            QtGui.QIcon('images/gnome-contacts.png'), '&Licence', self
        )
        infoLicence.setStatusTip('MIT')

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(newAction)
        fileMenu.addAction(exitAction)
        infoMenu = menubar.addMenu('&Info')
        infoMenu.addAction(infoAbout)
        infoMenu.addAction(infoLicence)
        
        self.setGeometry(500, 500, 500, 400)
        self.setWindowTitle(QtGui.qApp.applicationName())

    def on_about(self):
        QtGui.QMessageBox.about(
            self,
            u'About {0} v{1}'.format(
                QtGui.qApp.applicationName(), QtGui.qApp.applicationVersion()
            ),
            '<b>Some</b> <i>Text</i>...<p>'
            'Some more text describing the program...'
        )

  
def main():
    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('qBook')
    app.setApplicationVersion('0.1')
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Danke BlackJack.
Es ist etwas her, dass ich Python gemacht habe, denke das hei rmein Problem ist, dass ich von der PHP Programmierung komme. Mach das Projekt auch, um in Python mich wieder zu vertiefen.
Ich möchte halt ein kleines, Adressbuch schreiben, dass mit vcards anlegt. Habe da mich in den letzten Tagen viel belesen und habe jetzt mich halt für Qt entschieden.
Danke das ich da noch einige Fragen haben werde, oder kennt ihr ein gutes Tutorial für Qt?
Hast du vielleicht auch ein gutes Python Grunlagentutorial, dass ich mich nicht so ganz blamiere hier :-)
BlackJack

@beli3ver: In der Python-Dokumentation gibt es ein Tutorial. Und bei Qt ist die Qt-Dokumentation sehr umfangreich. Das ist nicht nur API-Referenz sondern die Dokumentation enthält auch Texte über grössere Zusammenhänge, also wie verschiedene Klassen zusammenspielen, und auch einige Beispielprogramme.
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Danke für die Tipps, werde es mir mal anschauen.
Macht es eigentlich noch Sinn mit der Syntax ovn Python 2 zu beschäftigen?
BlackJack

@beli3ver: Also mal davon abgesehen das die Syntax zwischen 2 und 3 bis auf ein paar kleine Änderungen identisch sind, stellt sich diese Frage IMHO nicht wirklich. Da immer noch deutlich mehr Python 2-Quelltexte im Netz zu finden sind, lohnt es sich auch bei Python 3 diesen Code lesen zu können.

Ansonsten setzen nicht wenige Python 2 immer noch produktiv ein. Die Mehrzahl der stabilen Webserver dürfte beispielsweise immer noch Python 2 als Standardpython haben. Ich kann jedenfalls aus beruflichen Gründen noch nicht auf Python 3 umsteigen und setze deshalb auch privat weiterhin auf Python 2. Der Umstieg bringt mir einfach nicht viel, ausser Arbeit und ich ärgere mich an einigen Stellen wie Python 3 mit Gewalt versucht Bytes als Unicode-Zeichenketten zu behandeln wo das nicht immer geht. Dateinamen und Kommandozeilenargumente sind unter Linux beispielsweise Byteketten. Und wenn die kein Text in der Kodierung sind, die Python 3 geraten hat, dann hat man Probleme.
Antworten