ich bin dabei eine Adressverwaltung zu erstellen.
Meine Adressdaten verwalte ich in einer json-Datei.
Zur Ausgabe und Verwaltung, verwende ich QTableView.
Bei EMail-Adressen verwende ich Hyperlinks.
Ich poste hier mal meinen Code, der lauffähig ist.
Code: Alles auswählen
import os
import sys
import copy
import operator # used for sorting
from PyQt5.QtCore import (
Qt,
QAbstractTableModel,
)
from PyQt5.QtWidgets import (
QApplication,
QMainWindow,
QTableView,
QAbstractItemView,
QAbstractScrollArea,
QLabel,
QWidget,
)
from PyQt5.QtGui import (
QStandardItemModel,
)
TableStyleSheet = """
QWidget{
selection-background-color: lightgreen;
selection-color: black;
background-color: lightgrey;
color: black;
border: none;
}
QHeaderView::section {
background-color: darkgrey;
color: black;
border: 1px solid #6c6c6c;
padding: 10px;
}
QTableView::section {
background-color: green;
border-radius: 14px;
border: 1px solid #6c6c6c;
padding: 10px;
}
"""
jsonData = {
"address": {
"29614003": {
"area": "Familie",
"name": "Mustrermann",
"first name": "Max",
"name addition": "",
"street": "Musterweg 1",
"postal code": "47111",
"location": "Musterhausen",
"province": "",
"country": "",
"index": "29614003"
}
},
"email": {
"29614003": {
"max": "max@mustermann.de",
"maxine": "maxine@mustermann.de",
"t0": "t0@mustermann.de",
"t1": "t1@mustermann.de",
"t2": "t2@mustermann.de",
"t3": "t3@mustermann.de",
"t4": "t4@mustermann.de"
}
}
}
class HyperlinkLabel(QLabel):
def __init__(self, parent=None):
super().__init__()
self.setOpenExternalLinks(True)
self.setParent(parent)
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.header = ['name', 'email']
self.data = [[name.title(), value]
for index, _dict_ in jsonData['email'].items()
for name, value in _dict_.items()]
self.object = View(parent=self)
self.setCentralWidget(self.object)
self.show()
class View(QTableView):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setAttribute(Qt.WA_DeleteOnClose)
self.installEventFilter(self)
self.setStyleSheet(TableStyleSheet)
self.parent = parent
self.data = sorted(parent.data)
self.header = parent.header
self.rowIndex = 0
# model
self.model = Model(self.data, self.header)
self.setModel(self.model)
value = self.model.data
self.ui()
def setHyperlink(self):
colPos = self.header.index('email')
hhHeight = self.horizontalHeader().sizeHint().height()
vhWidth = self.verticalHeader().sizeHint().width()
xPos = self.columnViewportPosition(colPos) + vhWidth
linkTemplate = '<a href={0}>{1}</a>'
for index, _dict_ in jsonData['email'].items():
for i, name in enumerate(_dict_):
value = _dict_[name]
# delete widget in cell
index = self.model.index(i, colPos)
# if change email, delete widget
self.setIndexWidget(index, None)
# create hyperlink to email with html format
hyperlink = HyperlinkLabel(self)
hyperlink.setText(linkTemplate.format('mailto:', value))
# move hylerlink to position xy
try:
yPos += hhHeight
except UnboundLocalError:
yPos = hhHeight + round(self.rowHeight(i)/2)
hyperlink.move(xPos, yPos)
# set index widget
self.setIndexWidget(index, hyperlink)
def ui(self):
self.setHyperlink()
self.update_table()
self.headerSize()
def updateGeometryAsync(self):
QTimer.singleShot(0, self.updateGeometry)
def headerSize(self):
self.setSizeAdjustPolicy(
QAbstractScrollArea.AdjustToContentsOnFirstShow)
self.resizeColumnsToContents()
self.resizeRowsToContents()
self.setWordWrap(True)
def update_table(self):
# ... when a row header label changes and makes the
# width of the vertical header change too
self.model.headerDataChanged.connect(self.updateGeometryAsync)
self.setModel(self.model)
# enable sorting
self.setSortingEnabled(True)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setSelectionMode(QAbstractItemView.SingleSelection)
self.setFocus()
self.selectRow(self.rowIndex)
class Model(QAbstractTableModel):
"""
Build table
"""
def __init__(self, data, header, *args):
QAbstractTableModel.__init__(self, *args)
self.data = data
self.header = header
def rowCount(self, widget):
try:
return len(self.data)
except TypeError:
return 0
def columnCount(self, widget):
try:
return len(self.data[0])
except (IndexError, TypeError):
return len(self.header)
def data(self, index, role):
if not index.isValid() or role != Qt.DisplayRole:
return None
return self.data[index.row()][index.column()]
def headerData(self, col, orientation, role):
if (orientation == Qt.Horizontal
and role == Qt.DisplayRole):
return self.header[col]
elif (orientation == Qt.Vertical
and role == Qt.DisplayRole):
return col
return None
def sort(self, col, order):
self.layoutAboutToBeChanged.emit()
try:
self.data = sorted(self.data, key=operator.itemgetter(col))
except IndexError:
pass
if order == Qt.DescendingOrder:
self.data #.reverse()
self.layoutChanged.emit()
def output_list(self):
return self.data
if __name__ == '__main__':
app = QApplication(sys.argv)
Window()
sys.exit(app.exec_())
Es gibt 2 Punkte, die ich vorrangig behandeln möchte.
Punkt 1:
Callback Funktion die es ermöglicht, bei Änderung der EMail-Adresse, den Hyperlink zu aktualisieren.
Punkt 2:
Beim klicken auf den Hyperlink der EMail-Adresse, öffnet sich dann das Standard EMail-Programm bei mir. Jedoch wird nicht die ausgewählte Ziel-Adresse in meinem EMail-Programm Thunderbird angezeigt.
Wünsche Euch einen schönen 1.Mai !
Grüße Nobuddy