#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' PyQt4 conversion of Qt Tutorial 'Address Book' - Part 2 The next step in creating the address book is to implement some user interactions. We will provide a push button that the user can click to add a new contact. Also, some form of data structure is needed to store these contacts in an organised way. NOTE: ==== The original C++ code uses a QMap to hold the contact names and addresses. PyQt4 does not include QMap, a Python 'dictionary' which holds 'keys' and 'values' was used instead. Extracted button panel creation to it's own 'init' method to make the code easier to read last modified: 2012-01-23 jg ref: http://developer.qt.nokia.com/doc/qt-4.8/tutorials-addressbook.html http://developer.qt.nokia.com/doc/qt-4.8/tutorials-addressbook-part2.html ''' import sys from PyQt4.QtGui import (QApplication, QWidget, QLabel, QTextEdit, QLineEdit, QGridLayout, QPushButton, QVBoxLayout, QMessageBox) from PyQt4.QtCore import (Qt, pyqtSlot) class AddressBook(QWidget): def __init__(self, parent=None): super(AddressBook, self).__init__(parent) # create a dictonary to hold contacts self._contacts = {} # create input labels and fields nameLabel = QLabel(self.tr("Name:")) self._nameLine = QLineEdit(self) self._nameLine.setReadOnly(True) addrLabel = QLabel(self.tr("Address:")) self._addrText = QTextEdit(self) self._addrText.setReadOnly(True) # create and populate layout mainLayout = QGridLayout() mainLayout.addWidget(nameLabel, 0, 0) mainLayout.addWidget(self._nameLine, 0, 1) mainLayout.addWidget(addrLabel, 1, 0, Qt.AlignTop) mainLayout.addWidget(self._addrText, 1, 1) mainLayout.addLayout(self._initButtonPanel(), 1, 2) # set this objects layout and window title self.setLayout(mainLayout) self.setWindowTitle(self.tr("Simple Address Book")) def _initButtonPanel(self): # create buttons self._addBtn = QPushButton(self.tr("&Add")) self._submitBtn = QPushButton(self.tr("&Submit")) self._cancelBtn = QPushButton(self.tr("&Cancel")) # set button visibility self._addBtn.show() self._submitBtn.hide() self._cancelBtn.hide() # define signal/slot connections for event handling self._addBtn.clicked.connect(self._addContact) self._submitBtn.clicked.connect(self._submitContact) self._cancelBtn.clicked.connect(self._cancel) # layout buttons layout = QVBoxLayout() layout.addWidget(self._addBtn, Qt.AlignTop) layout.addWidget(self._submitBtn) layout.addWidget(self._cancelBtn) layout.addStretch() # force additional space to bottom return layout @pyqtSlot() def _addContact(self): self._oldName = self._nameLine.text() self._oldAddr = self._addrText.toPlainText() self._nameLine.clear() self._addrText.clear() self._nameLine.setReadOnly(False) self._nameLine.setFocus(Qt.OtherFocusReason) self._addrText.setReadOnly(False) self._addBtn.setEnabled(False) self._submitBtn.show() self._cancelBtn.show() @pyqtSlot() def _submitContact(self): name = self._nameLine.text() addr = self._addrText.toPlainText() if not (name or addr): QMessageBox.information(self, self.tr("Empty Field"), self.tr("Please enter a name and address.")) return if name not in self._contacts: self._contacts[name] = addr QMessageBox.information(self, self.tr("Add Successful"), self.tr("{0} has been added to your address book.").format(name)) else: QMessageBox.information(self, self.tr("Add Unsuccessful"), self.tr("Sorry, {0} is already in your address book.").format(name)) # restore buttons if len(self._contacts) == 0: self._nameLine.clear() self._addrText.clear() self._nameLine.setReadOnly(True) self._addrText.setReadOnly(True) self._addBtn.setEnabled(True) self._submitBtn.hide() self._cancelBtn.hide() @pyqtSlot() def _cancel(self): self._nameLine.setText(self._oldName) self._nameLine.setReadOnly(True) self._addrText.setText(self._oldAddr) self._addrText.setReadOnly(True) self._addBtn.setEnabled(True) self._submitBtn.hide() self._cancelBtn.hide() def main(): app = QApplication(sys.argv) # required for all GUI applications ab = AddressBook() ab.show() # make me visible sys.exit(app.exec_()) # start main event thread if __name__ == '__main__': main()
Wednesday, January 25, 2012
Qt 4.8 Address Book Tutorial - Part 2
This code is based on the Qt 4.8 Address Book Tutorial Part 2, Adding Addresses.
Labels:
Qt Address Book Tutorial