action zu menubar hinzufuegen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
pylis
User
Beiträge: 6
Registriert: Samstag 15. März 2014, 18:08

ich bin absolute anfängerin, sowohl bei python als auch beim programmieren generell.
ich habe jetzt ein mainwindow erstellt und würde gern eine action(?) zu einem menüunterpunkt hinzufuegen, sodass sich beim klicken auf diesen menuepunkt ein dialogfenster oeffnet, das ich bereits in einer anderen pythin datei erstellt habe.
ich wuerd mich sehr ueber eure hilfe freuen!!!
liebe grüße
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo und willkommen pylis,
was hast du denn schon gemacht? Ohne deinen Quellcode zu sehen ist eine Hilfe natürlich immer etwas schwammig und ggf. eher ein Raten.
Man kann eine Callback-Methode über einen Event-Handler an einen Menüpunkt hängen. In der Callback-Methode wird dann
z.B. dein gewünschter Dialog aufgerufen. Das würde schematisch etwa so aussehen:

Code: Alles auswählen

  ...
  # Irgendwo in deiner Menü-Klasse/Methode 
  self.Bind(<Hier ein gewünschtes wx.Event eintragen>,<Hier deine self.Callback-Methode eintragen>)
  ...

def CallbackMethode(self, event):
     '''
     Ist die Methode, die oben über "self.Callback-Methode" angesprochen wird..
     '''
     ...
     dein Dialogaufruf
Wahrscheinlich sagt dir sowas wie Callback nicht viel, aber vielleicht solltest du dir von den wx-Seite unbedingt die wxDemo runterladen. In dem Demo-Browser kannst du mal nach "Menü" suchen. Im Democode findest du dann auch Beispiele, wie man Methoden an Menüpunkte bindet und andere Aktionen starten kann....
Ich bin etwas in Eile, ich hoffe, aber ich konnte trotzdem etwas helfen...
Viele Grüße
Piet Lotus
pylis
User
Beiträge: 6
Registriert: Samstag 15. März 2014, 18:08

Lieber Piet Lotus,
vielen Dank für die schnelle Antwort!
Ich werd mein Glück mal versuchen und meld mich dann bestimmt nochmal!
Liebe Grüße,
pylis
pylis
User
Beiträge: 6
Registriert: Samstag 15. März 2014, 18:08

also das ist mein quellcode, den ihc bereits erstellt habe:

Code: Alles auswählen

import sys
from PyQt4 import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.setWindowTitle('Daten')

        menubar = self.menuBar()
        menufile = menubar.addMenu('&File')

        EingabeSubjectID = QtGui.QAction(QtGui.QIcon(),'Neuer Subject Code',self)


        menuDateneingabe = menubar.addMenu('&Dateneingabe')
        menuDateneingabe.addAction(EingabeSubjectID)

app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

# Was beim Klicken auf "Neuer Subject Code" geoeffnet werden soll:
class DlgSubjectInfo(QtGui.QDialog):

    DlgSubjectInfoRunSignal = QtCore.pyqtSignal(str, str, str, str, str, str, str)




    def __init__(self, parent=None):



        QtGui.QDialog.__init__(self, parent)
        self.setWindowTitle('Please enter...')

        #widgets

        self.labelSubjCode = QtGui.QLabel("Subject Code:")
        self.lineEditSubjCode = QtGui.QLineEdit("Subject Code")

        self.Placeholder = QtGui.QFrame()
        self.Placeholder.setFrameShape(QtGui.QFrame.StyledPanel)

        self.pushButtonRun = QtGui.QPushButton("Ok")
        self.pushButtonCancel = QtGui.QPushButton("Cancel")


        self.hbox6 = QtGui.QHBoxLayout()
        self.hbox6.addWidget(self.pushButtonCancel)
        self.hbox6.addWidget(self.pushButtonRun)

        #layout
        self.hbox1 = QtGui.QGridLayout()

        self.hbox1.addWidget(self.labelSubjCode, 0, 1)
        self.hbox1.addWidget(self.lineEditSubjCode, 0, 2)


        self.layoutQForm = QtGui.QFormLayout()
        self.layoutQForm.addRow(self.hbox1)
        #self.layoutQForm.addRow(self.groupbox)
        self.layoutQForm.addRow(self.Placeholder)
        self.layoutQForm.addRow(self.hbox6)

        self.setLayout(self.layoutQForm)

        #signals and connections
        self.pushButtonRun.clicked.connect(self.Run)
        self.pushButtonCancel.clicked.connect(self.Cancel)

    def Run(self):

        self.lineEditSubjCode = self.lineEditSubjCode.text()

        self.close()

    def Cancel(self):

        self.close()

def main():
    app = QtGui.QApplication(sys.argv)
    win = DlgSubjectInfo()
    win.show()
    app.exec_()


if __name__ == "__main__":
    main()
Ich würde gern, dass beim Klicken auf "Neuer Subject Code" sich der Dialog oeffnet.
Kann mir jemand helfen?
Vielen Dank im Voraus :)
BlackJack

@pylis: Du kannst zwei unabhängige, vollständige GUI-Programme nicht einfach so hintereinander in eine Quelltextdatei kopieren. Beim starten läuft das bis Zeile 22 und danach geht es erst weiter wenn der Benutzer die erste GUI-Anwendung beendet.

Du brauchst aus dem zweiten Programm nur die Dialog-Klasse und die muss definiert werden bevor sie benutzt wird, also musst Du sicherstellen, dass die ``class``-Anweisung ausgeführt wird bevor Du die Kontrolle mit `exec_()` an die Qt-Hauptschleife übergibst.

Zur `QAction`: Deren `triggered()`-Signal muss mit Code verbunden werden der den Dialog anzeigt. Da könntest Du mal in der Qt-Dokumentation beim `QDialog` den Abschnitt über „Modal Dialogs” lesen.

Der Signalname `DlgSubjectInfoRunSignal` enthält ziemlich viel redundante Information. Die Klasse heisst ja schon `DlgSubjectInfo`, damit würde `RunSignal` völlig ausreichen. Und Signale tatsächlich `Signal` zu nennen ist nicht üblich. Die Signale die es bei den Klassen schon gibt haben diesen Zusatz nicht. Bleibt `run` übrig. Da `run` etwas längerfristiges ist, so ein Signal aber nur einen ”Zeitpunkt” signalisieren kann, würde ich es `started` nennen. Ebenfalls nach dem Muster der ganzen bereits vorhandenen Signale.

In der `DlgSubjectInfo.__init__()` wird ausnahmslos alles an das Objekt gebunden obwohl ausser `lineEditSubjCode` nichts davon später benutzt wird.

In der `Run()`-Methode, die selbst nach Qt-Namenskonventionen `run()` heissen sollte, wird das `lineEditSubjCode`-Attribut neu gebunden und zwar an eine Zeichenkette. Das ist sicher nicht gewollt.
pylis
User
Beiträge: 6
Registriert: Samstag 15. März 2014, 18:08

vielen Dank für die schnelle Antwort.
Leider versteh ichs noch nicht wirklich... könntest du mir sagen, wie der Befehl lauten müsste, den ich dann zu "Neuer Subject Code" hinzufügen müsste?
wie definiere ich denn die Dialog Klasse?
Liebe Grüße
BlackJack

@pylis: Klassen werden durch Ausfühung einer ``class``-Anweisung definiert. Und das muss halt passieren *bevor* man die Klasse dann verwenden kann.

Es ist auch nicht „ein Befehl” den man hier schreiben muss, sondern den gesamten Code der nötig ist um den Dialog anzuzeigen, und falls man das Modal tun möchte, auch Code um das Ergebnis abzufragen. Und den Code, vorzugsweise in einer Methode, muss man dann mit dem `triggered()`-Signal von dem `QAction`-Exemplar verbinden, damit er aufgerufen wird wenn das Menü mit dieser `QAction` vom Benutzer ausgewählt wird.

Ich habe so ein bisschen den Verdacht, dass Du hier eher anhand von Quelltextbeispielen herum rätst statt ein Programm selber zu entwickeln. Wie gut kannst Du denn die Grundlagen von Python und objektorientierter Programmierung? Womit hast Du das gelernt? Hast Du das Tutorial in der Python-Dokumentation schon mal durchgearbeitet? Welches Qt-Tutorial hast Du bis jetzt verwendet?
Antworten