Home  Contents

Dialoge in PyQt4

Dialogfenster oder Dialoge sind unverzichtbarer Bestandteil der meisten modernen grafischen Anwendungen. Ein Dialog wird als Austausch zwischen zwei oder mehr Personen definiert. Bei einer Computeranwendung ist ein Dialog ein Fenster, das verwendet wird, um mit der Anwendung zu reden. Ein Dialog wird benutzt, um Daten zu übergeben und zu bearbeiten, Anwendungseinstellungen zu verändern etc. Dialoge sind ein wichtiges Mittel zur Kommunikation zwischen Nutzer und Programm.

Es gibt grundsätzlich zwei Arten von Dialogen: Vordefinierte Dialoge und maßgeschneiderte Dialoge.

Vordefinierte Dialoge

QInputDialog

Der QInputDialog bietet einen einfachen Fertigdialog, um einen einfachen Wert von einem Nutzer zu erhalten. Der Eingabewert kann ein String, eine Zahl oder ein Item von einer Liste sein.

#!/usr/bin/python

# inputdialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class InputDialog(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 350, 80)
        self.setWindowTitle('InputDialog')

        self.button = QtGui.QPushButton('Dialog', self)
        self.button.setFocusPolicy(QtCore.Qt.NoFocus)

        self.button.move(20, 20)
        self.connect(self.button, QtCore.SIGNAL('clicked()'), self.showDialog)
        self.setFocus()

        self.label = QtGui.QLineEdit(self)
        self.label.move(130, 22)


    def showDialog(self):
        text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')

        if ok:
            self.label.setText(unicode(text))


app = QtGui.QApplication(sys.argv)
icon = InputDialog()
icon.show()
app.exec_()

Das Beispiel enthält einen Knopf und ein Eingabezeilen-Widget. Der Knopf zeigt einen Eingabedialog für Textwerte. Der eingegebene Text wird im Eingabezeilen-Widget angezeigt.


 text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')

Diese Zeile sorgt für die Anzeige des Eingabedialogs. Der erste String ist der Titel des Dialogs, der zweite eine Mitteilung innerhalb des Dialogs. Der Dialog gibt den eingegeben Text und einen boolschen Wert wieder. Wenn wir auf dne OK-Knopf drücken, ist dieser Wert true, andernfalls false.

Eingabedialog

Abbildung: Eingabedialog

QColorDialog

Der QColorDialog bietet ein Dialog-Widget zur Farbauswahl.

#!/usr/bin/python

# colordialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class ColorDialog(QtGui.QWidget):
    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)

        color = QtGui.QColor(0, 0, 0) 

        self.setGeometry(300, 300, 250, 180)
        self.setWindowTitle('ColorDialog')

        self.button = QtGui.QPushButton('Dialog', self)
        self.button.setFocusPolicy(QtCore.Qt.NoFocus)
        self.button.move(20, 20)

        self.connect(self.button, QtCore.SIGNAL('clicked()'), self.showDialog)
        self.setFocus()

        self.widget = QtGui.QWidget(self)
        self.widget.setStyleSheet("QWidget { background-color: %s }" 
            % color.name())
        self.widget.setGeometry(130, 22, 100, 100)


    def showDialog(self):
        col = QtGui.QColorDialog.getColor()

        if col.isValid():
            self.widget.setStyleSheet("QWidget { background-color: %s }"
                % col.name())

app = QtGui.QApplication(sys.argv)
cd = ColorDialog()
cd.show()
app.exec_()

Das Anwendungsbeispiel zeigt einen Druckknopf und ein QWidget. Der Widget-Hintergrund ist schwarz eingefärbt, durch die Verwendung des QColorDialog können wir die Hintergrundfarbe ändern.

 color = QtGui.QColorDialog.getColor()

Diese Zeile lässt den QColorDialog aufklappen.

if col.isValid():
    self.widget.setStyleSheet("QWidget { background-color: %s }"
        % col.name())

Wir prüfen hier die Validität der Farbe. Klicken wir den Cancel-Knopf, wird kein korrekte Farbe zurückgegeben, andernfalls ändern wir die Hintergrundfarbe durch Verwendung von Stylesheets.

Farbauswahldialog

Abbildung: Farbauswahldialog

QFontDialog

Der QFontDialog ist ein Dialog-Widget zur Schriftauswahl.

#!/usr/bin/python

# fontdialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class FontDialog(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        hbox = QtGui.QHBoxLayout()

        self.setGeometry(300, 300, 250, 110)
        self.setWindowTitle('FontDialog')

        button = QtGui.QPushButton('Dialog', self)
        button.setFocusPolicy(QtCore.Qt.NoFocus)
        button.move(20, 20)

        hbox.addWidget(button)

        self.connect(button, QtCore.SIGNAL('clicked()'), self.showDialog)

        self.label = QtGui.QLabel('Knowledge only matters', self)
        self.label.move(130, 20)

        hbox.addWidget(self.label, 1)
        self.setLayout(hbox)


    def showDialog(self):
        font, ok = QtGui.QFontDialog.getFont()
        if ok:
            self.label.setFont(font)


app = QtGui.QApplication(sys.argv)
cd = FontDialog()
cd.show()
app.exec_()

In unserem Beispiel haben wir einen Knopf und ein Label. Mit dem QFontDialog können wir die Schriftart des Labels ändern.

 hbox.addWidget(self.label, 1)

Wir machen das Label größenverstellbar. Das ist notwendig, weil der Text größer werden könnte, wenn wir eine andere Schriftart auswählen. Andernfalls könnte das Label nicht vollständig sichtbar bleiben.

 font, ok = QtGui.QFontDialog.getFont()

Hier lassen wir den Schrifttypdialog aufklappen.

 if ok:
     self.label.setFont(font)

Wenn wir auf OK klicken, ändert sich die Schrift des Labels.

Schriftauswahldialog

Abbildung: Schriftauswahldialog

QFileDialog

Der QFileDialog ist ein Dialog, der dem Nutzer die Auswahl von Dateien oder Verzeichnissen erlaubt. Die Dateien können dabei sowohl für das Öffnen als auch das Speichern ausgewählt werden.

#!/usr/bin/python

# openfiledialog.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class OpenFile(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('OpenFile')

        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)
        self.statusBar()
        self.setFocus()

        exit = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)
        exit.setShortcut('Ctrl+O')
        exit.setStatusTip('Open new File')
        self.connect(exit, QtCore.SIGNAL('triggered()'), self.showDialog)

        menubar = self.menuBar()
        file = menubar.addMenu('&File')
        file.addAction(exit)

    def showDialog(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
                    '/home')
        file=open(filename)
        data = file.read()
        self.textEdit.setText(data)

app = QtGui.QApplication(sys.argv)
cd = OpenFile()
cd.show()
app.exec_()

Das Beispiel zeigt eine Menüleiste, ein zentriertes Textbearbeitungs-Widget und eine Statusleiste. Die Statusleiste dient lediglich zu Designzwecken. Das Menüitem ruft den QFileDialog auf, der zur Auswahl einer Datei verwendet wird. Die Inhalte der Datei werden in das Textbearbeitungs-Widget geladen.

class OpenFile(QtGui.QMainWindow):
...
        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)

Das Beispiel basiert auf dem QMainWindow-Widget, da wir das Textbearbeitung-Widget zentral setzen. Dies lässt sich mit dem QMainWindow-Widget leicht umsetzen, ohne auf Layouts zurück greifen zu müssen.

 filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
                    '/home')

Wir lassen den QFileDialog aufpoppen. Der erste String in der getOpenFileName-Methode ist die Überschrift. Der zweite bestimmt das Arbeitsverzeichnis des Dialogs. Standardmäßig steht der Filter auf All files (*).

 file=open(filename)
 data = file.read()
 self.textEdit.setText(data)

Der ausgewählte Dateiname wird gelesen und die Datei mit dem Inhalt des Textbearbeitungs-Widgets gefüllt.

Dateiauswahldialog

Abbildung: Dateiauswahldialog