No MainWindow after refactoring
Tony Arnold
tony.arnold at manchester.ac.uk
Sun Jun 20 21:49:22 BST 2021
Hi Axel,
This is a bit of a guess but I don't see anything in your model that
would cause the view to update, so you may need to emit a data changed
signal from your model. This should be picked up by the view and update
it.
(It would be useful to see the ui source file, as I presume that's
where the view is defined).
Regards,Tony.
On Sun, 2021-06-20 at 19:41 +0200, Axel Rau wrote:
> Hi, David and Tony,
> you both are right.
>
> I made some mistakes while stripping down my codebase and while
> preparing it for the ML.
> The posted code does not really show the problem, if corrected as you
> pointed out, Tony, it runs well.
> And yes, I'm using PyCharm as IDE and I have a better structured
> layout [1].
>
> To show the problem, I attach new versions of both files.
> The problem happens, if I start creating and loading more zones by
> calling
> model.loadZones() from the __main__ code in za.py (commented out in
> the attached version).
> The debugger shows return from model.loadZones(), but nothing is
> displayed then.
>
> I guess, model.loadZones() would better be called from some event
> code, once I’m using events.
>
> Thanks for your help,
> Axel
>
> PS: [1]
>
>
>
>
>
>
> > Am 20.06.2021 um 16:01 schrieb Tony Arnold <
> > tony.arnold at manchester.ac.uk>:
> >
> > Hi Alex,
> >
> > So the problem is how you reference ZoneModel in za.py. You're
> > referencing it as model.ZoneModel on line 24. You should reference
> > as just ZoneModel.
> >
> > You also need to import sys in za.py, but that's not too critical
> > unless you want to pass command line parameters into your
> > application.
> >
> > You also need to import QtCore in model.py as someone else has
> > pointed out.
> >
> > I've attached the corrected files.
> >
> > I highly recommend using a suitable development environment which
> > will highlight syntax and other errors dynamically. I would suggest
> > using eric or pycharm.
> >
> > Regards,
> > Tony.
> >
> > On Sat, 2021-06-19 at 15:25 +0200, Axel Rau wrote:
> > > Hi all,
> > > I’m new to qt and pyqt.
> > > The test app [1] in one module works fine (mainwindow opens and
> > > shows loaded data).After putting ZoneModel and Zone classes in
> > > separate modules (za.py, mode.py)[2], no MainWindow is displayed,
> > > just the app icon.
> > > What am I doing wrong?
> > > Any help appreciated,Axel
> > > [1]
> > > from za_main_ui import Ui_mainWindowfrom PyQt5 import QtWidgets,
> > > QtCore
> > > ##from PyQt5.QtCore import QModelIndex, Qt
> > > import dns.query, dns.resolver, dns.zone, dns.rdataset,
> > > dns.rdatatypeimport sys
> > > windowHeading = 'za - DNS zone admin'
> > > class ZoneModel(QtCore.QAbstractTableModel): def
> > > __init__(self, data=[[]],
> > > parent=None): super().__init__(parent) self.zone =
> > > Zone('some.do.main‘)
> > > def headerData(self, section: int, orientation:
> > > QtCore.Qt.Orientation, role: int): if role ==
> > > QtCore.Qt.DisplayRole: if orientation ==
> > > QtCore.Qt.Horizontal: return ['OwnerName', 'TTL',
> > > 'Type', 'Rdata'][section] else: return
> > > None
> > > def columnCount(self, parent=None): return
> > > self.zone.columnCount()
> > > def rowCount(self, parent=None): return
> > > self.zone.rowCount()
> > > def data(self, index: QtCore.QModelIndex, role:
> > > int): if role == QtCore.Qt.DisplayRole: row =
> > > index.row() col = index.column() return
> > > self.zone.data(row, col)
> > >
> > > class Zone(object): IP_XFR_NS = '1234:5678:9abc:def::1'
> > > def __init__(self, zone_name): self.zone_name =
> > > zone_name self.z = dns.zone self.d = [['', '', '',
> > > '']]
> > > def data(self, row: int, column: int) -> str: if not
> > > self.d: self.loadZone() v =
> > > self.d[row][column] if not v: v = '' return str(v)
> > > def loadZone(self): row = 0 self.z =
> > > dns.zone.from_xfr(dns.query.xfr(self.IP_XFR_NS, self.zone_name))
> > > for name in self.z.keys(): name =
> > > str(name) if name == '@': name =
> > > '' self.d[row][0] = name node =
> > > self.z[name] for the_rdataset in
> > > node: self.d[row][1] =
> > > str(the_rdataset.ttl) for rdata in
> > > the_rdataset: self.d[row][2] =
> > > dns.rdatatype.to_text(the_rdataset.rdtype) sel
> > > f.d[row][3] = str(rdata) row = row +
> > > 1 self.d.append(['', '', '', ''])
> > >
> > > def columnCount(self): if len(self.d) <
> > > 2: self.loadZone() return len(self.d[0])
> > > def rowCount(self): if len(self.d) <
> > > 2: self.loadZone() return len(self.d)
> > >
> > > class ZaMainWindow(QtWidgets.QMainWindow,Ui_mainWindow): def
> > > __init__(self): super(ZaMainWindow,self).__init__()
> > > self.setupUi(self)
> > > if __name__ == '__main__': app =
> > > QtWidgets.QApplication(sys.argv)
> > > domainZones = {} ip4Zones = {} ip6Zones = {}
> > > subdomains = {} ip4Nets = {} ip6Nets = {}
> > >
> > >
> > > mw = ZaMainWindow() model = ZoneModel() view =
> > > mw.maintableView view.setColumnWidth(0,
> > > 200) view.setColumnWidth(1, 40) view.setColumnWidth(2,
> > > 40) view.setColumnWidth(3, 400) hh =
> > > view.horizontalHeader() hh.setStretchLastSection(True) hh.s
> > > etSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) vi
> > > ew.setModel(model) mw.show()
> > > sys.exit(app.exec_())
> > >
> > >
> > > [2]za.py:
> > > from za_main_ui import Ui_mainWindowfrom .model import
> > > ZoneModelfrom PyQt5 import QtWidgets
> > >
> > > class ZaMainWindow(QtWidgets.QMainWindow,Ui_mainWindow): def
> > > __init__(self): super(ZaMainWindow,self).__init__()
> > > self.setupUi(self)
> > > if __name__ == '__main__': app =
> > > QtWidgets.QApplication(sys.argv)
> > > domainZones = {} ip4Zones = {} ip6Zones = {}
> > > subdomains = {} ip4Nets = {} ip6Nets = {}
> > >
> > >
> > > mw = ZaMainWindow() model = model.ZoneModel() view =
> > > mw.maintableView view.setColumnWidth(0,
> > > 200) view.setColumnWidth(1, 40) view.setColumnWidth(2,
> > > 40) view.setColumnWidth(3, 400) hh =
> > > view.horizontalHeader() hh.setStretchLastSection(True) hh.s
> > > etSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) vi
> > > ew.setModel(model) mw.show()
> > > sys.exit(app.exec_())
> > > model.py:
> > > import dns.query, dns.resolver, dns.zone, dns.rdataset,
> > > dns.rdatatype
> > > windowHeading = 'za - DNS zone admin'
> > > class ZoneModel(QtCore.QAbstractTableModel): def
> > > __init__(self, data=[[]],
> > > parent=None): super().__init__(parent) self.zone =
> > > Zone('some.do.main')
> > > def headerData(self, section: int, orientation:
> > > QtCore.Qt.Orientation, role: int): if role ==
> > > QtCore.Qt.DisplayRole: if orientation ==
> > > QtCore.Qt.Horizontal: return ['OwnerName', 'TTL',
> > > 'Type', 'Rdata'][section] else: return
> > > None
> > > def columnCount(self, parent=None): return
> > > self.zone.columnCount()
> > > def rowCount(self, parent=None): return
> > > self.zone.rowCount()
> > > def data(self, index: QtCore.QModelIndex, role:
> > > int): if role == QtCore.Qt.DisplayRole: row =
> > > index.row() col = index.column() return
> > > self.zone.data(row, col)
> > >
> > > class Zone(object): IP_XFR_NS = '1234:5678:9abc:def::1‘
> > > def __init__(self, zone_name): self.zone_name =
> > > zone_name self.z = dns.zone self.d = [['', '', '',
> > > '']]
> > > def data(self, row: int, column: int) -> str: if not
> > > self.d: self.loadZone() v =
> > > self.d[row][column] if not v: v = '' return str(v)
> > > def loadZone(self): row = 0 self.z =
> > > dns.zone.from_xfr(dns.query.xfr(self.IP_XFR_NS, self.zone_name))
> > > for name in self.z.keys(): name =
> > > str(name) if name == '@': name =
> > > '' self.d[row][0] = name node =
> > > self.z[name] for the_rdataset in
> > > node: self.d[row][1] =
> > > str(the_rdataset.ttl) for rdata in
> > > the_rdataset: self.d[row][2] =
> > > dns.rdatatype.to_text(the_rdataset.rdtype) sel
> > > f.d[row][3] = str(rdata) row = row +
> > > 1 self.d.append(['', '', '', ''])
> > >
> > > def columnCount(self): if len(self.d) <
> > > 2: self.loadZone() return len(self.d[0])
> > > def rowCount(self): if len(self.d) <
> > > 2: self.loadZone() return len(self.d)
> > >
> > >
> > > ---PGP-Key: CDE74120 ☀ computing @ chaos claudius
> > --
> > Tony Arnold MBCS, CITP | Senior IT Security Analyst | Directorate
> > of IT Services | Office 1, Kilburn Building | The University of
> > Manchester | Manchester M13 9PL | T: +44 161 275 6093 | M: +44 773
> > 330 0039
> >
> > <model.py><za.py>
>
> ---
> PGP-Key: CDE74120 ☀ computing @ chaos claudius
>
>
>
>
--
Tony Arnold MBCS, CITP | Senior IT Security Analyst | Directorate of IT Services | Office 1, Kilburn Building | The University of Manchester | Manchester M13 9PL | T: +44 161 275 6093 | M: +44 773 330 0039
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20210620/8e978f27/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4054 bytes
Desc: not available
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20210620/8e978f27/attachment-0001.bin>
More information about the PyQt
mailing list