[PySide] Form dialog subclassing QDialog
Aaron Richiger
a.richi at bluewin.ch
Fri Feb 28 19:59:49 CET 2014
Hello Jerome
While I waited for your code, I just implemented a hello world
application with classical ModelViewController structure that does what
you want. Have a look at the NewPersonDialog class to see how it is
implemented...
I will have a look at your code now...
Have a nice evening!
Aaron
##################################import sys
from PySide.QtGui import *
from PySide.QtCore import *
class Person(object):
'''Model for a person'''
def __init__(self, name, age):
self.name = name
self.age = age
class PersonTableModel(QStandardItemModel):
'''TableModel for multiple persons.'''
def __init__(self, persons, parent = None):
super(PersonTableModel, self).__init__(parent)
self.persons = persons
for i in xrange(len(self.persons)):
person = self.persons[i]
self.setItem(i, 0, QStandardItem(person.name))
self.setItem(i, 1, QStandardItem(str(person.age)))
self.setHeaderData(0, Qt.Horizontal, "Name")
self.setHeaderData(1, Qt.Horizontal, "Age")
def add_person(self, person):
self.persons.append(person)
self.appendRow([QStandardItem(person.name),
QStandardItem(str(person.age))])
class PersonTableView(QTableView):
def __init__(self, model, parent = None):
super(PersonTableView, self).__init__(parent)
self.setModel(model)
class MainWindow(QWidget):
'''UI definition of the main window.'''
def __init__(self, model):
super(MainWindow, self).__init__()
self.model = model
self.setupUi()
def setupUi(self):
'''Initialize the GUI with different types of clickable labels'''
self.layoutGeneral = QVBoxLayout(self)
self.table_view = PersonTableView(self.model, self)
self.pb_add = QPushButton("Add person")
self.pb_delete = QPushButton("Delete person")
self.layoutGeneral.addWidget(self.table_view)
self.layoutGeneral.addWidget(self.pb_add)
self.layoutGeneral.addWidget(self.pb_delete)
class NewPersonDialog(QDialog):
'''Dialog to show a form for a new person.'''
def __init__(self):
super(NewPersonDialog, self).__init__()
self.setupUi()
self.name = None
self.age = None
self.connectSignals()
def setupUi(self):
self.grid = QGridLayout(self)
self.lbName = QLabel('Name:', self)
self.lbAge = QLabel('Age:', self)
self.leName = QLineEdit(self)
self.leAge = QLineEdit(self)
self.pbCancel = QPushButton("Cancel", self)
self.pbOk = QPushButton("OK", self)
self.pbOk.setDefault(True)
self.grid.addWidget(self.lbName, 0, 0)
self.grid.addWidget(self.lbAge, 1, 0)
self.grid.addWidget(self.leName, 0, 1)
self.grid.addWidget(self.leAge, 1, 1)
self.grid.addWidget(self.pbCancel, 2, 0)
self.grid.addWidget(self.pbOk, 2, 1)
def connectSignals(self):
self.pbOk.clicked.connect(self.on_ok)
self.pbCancel.clicked.connect(self.reject)
def on_ok(self):
self.name = self.leName.text()
self.age = int(self.leAge.text())
self.accept()
class Controller(QObject):
'''Controls interaction between model and view'''
def __init__(self):
super(Controller, self).__init__()
self.model = PersonTableModel([Person("Guido", 42),
Person("Bill", 55)])
self.view = MainWindow(self.model)
self.connectSignals()
def start(self):
'''Start application'''
self.view.show()
def connectSignals(self):
'''Connect the buttons with the corresponding slot'''
self.view.pb_add.clicked.connect(self.on_add_person)
self.view.pb_delete.clicked.connect(self.on_delete_person)
def on_add_person(self):
'''A label was clicked, show the text of the label in the
display'''
dialog = NewPersonDialog()
if dialog.exec_():
self.model.add_person(Person(dialog.name, dialog.age))
def on_delete_person(self):
'''To be implemented.'''
pass
def main():
app = QApplication(sys.argv)
controller = Controller()
controller.start()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
###################################################
Am 28.02.2014 18:47, schrieb Jérôme:
> Le 2014-02-28 18:37, Aaron Richiger a écrit :
>> Hello Jerome!
> Hi.
>
>> Welcome in the PySide world...
> Thank you !
>
>> Would it be possible, to send us the code
>> (source files). It's always great to run the code, a UI or a error
>> message often says more than many words...
> I deliberately stripped the relevant parts in my former message, as the
> rest might be confusing. Here are the files I'm running. This is just a
> test, so don't be surprised to see stupid or hardcoded stuff.
>
>
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20140228/2166655d/attachment.html>
More information about the PySide
mailing list