Creating an object in Python with lots of long arguments See the proposed changes in this Pull Request under def add_talk.

date = self.talkDetailsWidget.dateEdit.date()
time = self.talkDetailsWidget.timeEdit.time()
presentation = Presentation(
    unicode(self.talkDetailsWidget.titleLineEdit.text()).strip(),
    unicode(self.talkDetailsWidget.presenterLineEdit.text()).strip(),
    unicode(self.talkDetailsWidget.descriptionTextEdit.toPlainText()).strip(),
    unicode(self.talkDetailsWidget.categoryLineEdit.text()).strip(),
    unicode(self.talkDetailsWidget.eventLineEdit.text()).strip(),
    unicode(self.talkDetailsWidget.roomLineEdit.text()).strip(),
    unicode(date.toString(Qt.ISODate)),
    unicode(time.toString(Qt.ISODate)))


There's a lot of boilerplate code (e.g. unicode(), seld.talkDetailsWidget, text(), strip(), etc.) How could you reduce that and still have the code be easy to understand?

My thinking is if something along the lines of this were possible:

map(str.strip,
    map(unicode, 
        map(QLineEdit.text,
            map(self.talkDetailsWidget, fields))))
Your TalkDetailsWidget is underdeveloped, I think.  You could say that you have a view but no model, and that is causing you problems.

You want to be able to write

talk = self.talkDetailsWidget
presentation = Presentation(title=talk.title,
                          speaker=talk.presenter,   # ← Why the inconsistent vocabulary?
                      description=talk.description,
                         category=talk.category,
                            event=talk.event,
                             room=talk.room,
                             date=unicode(talk.date.toString(Qt.ISODate)),
                             time=unicode(talk.time.toString(Qt.ISOTime)))


Therefore, you'll need to implement new properties in TalkDetailsWidget.  To avoid copy-and-paste programming in TalkDetailsWidget, I suggest writing those getters using metaprogramming.

class TalkDetailsWidget(QWidget):
    …

    def _field_reader(field, method='text'):
        return property(fget=lambda self: unicode(getattr(getattr(self, field), method)()).strip(),
                        doc="Returns a Unicode string from the %s field with spaces stripped from each end" % (field))

    title       = _field_reader('titleLineEdit')
    presenter   = _field_reader('presenterLineEdit')
    description = _field_reader('descriptionTextEdit', method='toPlainText')
    category    = _field_reader('categoryLineEdit')
    event       = _field_reader('eventLineEdit')
    room        = _field_reader('roomLineEdit')

    @property
    def date(self):
        self.dateEdit.date()

    @property
    def time(self):
        self.timeEdit.time()