Python 我对QAbstractTableModel类的对象有问题
在窗口中,我构造了QDockWidget类的对象和QabStretctTableModel类的对象。这些对象以不同的方式显示SQL表中的相同数据。当我在对象QAbstractTableModel中标记行时,相应的数据显示在对象QDockWidget中。当我用鼠标标记行时,它工作,但当我用箭头(从键盘)在表格上移动时,我就有问题了。当我按箭头向下移动时,它工作正常,但如果我向上移动,QDockWidget类的object中显示的数据与object QabStretctTableModel中标记行中显示的数据不同。这是对象QAbstractTableModel中上一行的数据。为什么会这样?我想要-当我向上或向下移动时,数据总是相同的,类QAbstractTableModel的对象中标记为row的数据表单将显示在对象QDockWidget中Python 我对QAbstractTableModel类的对象有问题,python,pyqt,Python,Pyqt,在窗口中,我构造了QDockWidget类的对象和QabStretctTableModel类的对象。这些对象以不同的方式显示SQL表中的相同数据。当我在对象QAbstractTableModel中标记行时,相应的数据显示在对象QDockWidget中。当我用鼠标标记行时,它工作,但当我用箭头(从键盘)在表格上移动时,我就有问题了。当我按箭头向下移动时,它工作正常,但如果我向上移动,QDockWidget类的object中显示的数据与object QabStretctTableModel中标记行中
class Adresat(QDockWidget):
def __init__(self, parent):
super().__init__(parent)
...
self.widok = QTableView()
etykieta1 = QLabel("Nazwa ")
etykieta1.setFont(QFont("Arial",12))
etykieta2 = QLabel("Adres ")
etykieta2.setFont(QFont("Arial",12))
....
Nazwa1Edt = QLineEdit()
Nazwa1Edt.setMaxLength(100)
Nazwa1Edt.setFont(QFont("Arial",12))
Nazwa1Edt.setReadOnly(True)
AdresEdt = QLineEdit()
AdresEdt.setMaxLength(50)
AdresEdt.setFont(QFont("Arial",12))
AdresEdt.setReadOnly(True)
....
uklad1 = QHBoxLayout()
uklad1.addWidget(etykieta1)
uklad1.addWidget(Nazwa1Edt)
uklad1.addSpacing(290)
uklad2 = QHBoxLayout()
uklad2.addWidget(etykieta2)
uklad2.addWidget(AdresEdt)
uklad2.addSpacing(350)
.....
ukladV = QGridLayout()
ukladV.setContentsMargins(5,5,5,5)
ukladV.addLayout(uklad1, 1, 0, 1, 1)
ukladV.addLayout(uklad2, 2, 0, 1, 1)
.....
uklad.addWidget(self.widok)
....
uklad.addLayout(ukladV, 2, 0, 1, 1)
......
pola = ['Nazwa', 'Adres',..]
self.model = TabModel4(pola)
....
self.widok.setModel(self.model)
font = QFont("Tahoma", 11)
style = "::section {""background-color: lightsteelblue; }"
self.widok.horizontalHeader().setStyleSheet(style)
self.widok.horizontalHeader().setFont(font)
self.widok.setFont(font)
...
dokogo = []
for d in tabelka1:
dokogo.append([d[0],d[1],...)
self.model.aktualizuj(dokogo)
self.model.layoutChanged.emit()
self.widok.hideColumn(1)
self.widok.resizeColumnsToContents()
self.widok.setSortingEnabled(True)
self.widok.horizontalHeader().setStretchLastSection(True)
self.widok.setSelectionBehavior(QAbstractItemView.SelectRows)
self.widok.setSelectionMode(QAbstractItemView.SingleSelection)
self.widget = QWidget()
self.widget.setContentsMargins(0, 0, 0, 0)
self.widget.setLayout(QVBoxLayout())
self.widget.layout().addLayout(uklad)
self.setWidget(self.widget)
....
class TabModel4(QAbstractTableModel):
""" Tabelaryczny model danych """
def __init__(self, pola=[], dane=[], parent=None):
super(TabModel4, self).__init__()
self.pola = pola
self.tabela = dane
def aktualizuj(self, dane):
""" Przypisuje źródło danych do modelu """
self.tabela = dane
def rowCount(self, parent=QModelIndex()):
""" Zwraca ilość wierszy """
return len(self.tabela)
def columnCount(self, parent=QModelIndex()):
""" Zwraca ilość kolumn """
if self.tabela:
return len(self.tabela[0])
else:
return 0
def data(self, index, rola=Qt.DisplayRole):
""" Wyświetlanie danych """
i = index.row()
j = index.column()
if rola==Qt.BackgroundColorRole:
if i%2: bgColor=QColor('#F5F5BC')
else: bgColor=QColor('#EEE8AA')
return QVariant(QColor(bgColor))
if rola == Qt.DisplayRole:
Nazwa1Edt.setText(self.tabela[i][0]+self.tabela[i][1])
AdresEdt.setText(self.tabela[i][2])
...
return '{0}'.format(self.tabela[i][j])
else:
return QVariant()
def setData(self, index, value, rola=Qt.DisplayRole):
""" Zmiana danych """
i = index.row()
j = index.column()
if rola == Qt.DisplayRole:
self.tabela[i][j] = value
def flags(self, index):
""" Zwraca właściwości kolumn tabeli """
flags = super(TabModel4, self).flags(index)
j = index.column()
if j!= 0 and j != 1 and j != 2 and j!=3 and j!=4 and j!=5:
flags |= Qt.ItemIsEditable
return flags
def headerData(self, sekcja, kierunek, rola=Qt.DisplayRole):
""" Zwraca nagłówki kolumn """
if rola == Qt.DisplayRole and kierunek == Qt.Horizontal:
return self.pola[sekcja]
elif rola == Qt.DisplayRole and kierunek == Qt.Vertical:
return sekcja + 1
else:
return QVariant()`
当我在对象QAbstractTableModel中标记行时,相应的数据显示在对象QDockWidget中。当我用鼠标标记行时,它工作,但当我用箭头(从键盘)在表格上移动时,我就有问题了。当我按箭头向下移动时,它工作正常,但如果我向上移动,QDockWidget类的object中显示的数据与object QabStretctTableModel中标记行中显示的数据不同。这是对象QAbstractTableModel中上一行的数据。为什么会这样?我想要-当我向上或向下移动时,数据将始终相同,来自类QabStretctTableModel对象中标记行的数据将显示在对象QDockWidget中。我解决了这个问题。我定制了类QTableView,我在这个类中使用并定义了函数keyPressEvent,这很有帮助。我以前定义过这个函数,但在wron类中,我将她放在QAbstractTableModel中
class Adresat(QDockWidget):
def __init__(self, parent):
super().__init__(parent)
...
self.widok = QTableView()
etykieta1 = QLabel("Nazwa ")
etykieta1.setFont(QFont("Arial",12))
etykieta2 = QLabel("Adres ")
etykieta2.setFont(QFont("Arial",12))
....
Nazwa1Edt = QLineEdit()
Nazwa1Edt.setMaxLength(100)
Nazwa1Edt.setFont(QFont("Arial",12))
Nazwa1Edt.setReadOnly(True)
AdresEdt = QLineEdit()
AdresEdt.setMaxLength(50)
AdresEdt.setFont(QFont("Arial",12))
AdresEdt.setReadOnly(True)
....
uklad1 = QHBoxLayout()
uklad1.addWidget(etykieta1)
uklad1.addWidget(Nazwa1Edt)
uklad1.addSpacing(290)
uklad2 = QHBoxLayout()
uklad2.addWidget(etykieta2)
uklad2.addWidget(AdresEdt)
uklad2.addSpacing(350)
.....
ukladV = QGridLayout()
ukladV.setContentsMargins(5,5,5,5)
ukladV.addLayout(uklad1, 1, 0, 1, 1)
ukladV.addLayout(uklad2, 2, 0, 1, 1)
.....
uklad.addWidget(self.widok)
....
uklad.addLayout(ukladV, 2, 0, 1, 1)
......
pola = ['Nazwa', 'Adres',..]
self.model = TabModel4(pola)
....
self.widok.setModel(self.model)
font = QFont("Tahoma", 11)
style = "::section {""background-color: lightsteelblue; }"
self.widok.horizontalHeader().setStyleSheet(style)
self.widok.horizontalHeader().setFont(font)
self.widok.setFont(font)
...
dokogo = []
for d in tabelka1:
dokogo.append([d[0],d[1],...)
self.model.aktualizuj(dokogo)
self.model.layoutChanged.emit()
self.widok.hideColumn(1)
self.widok.resizeColumnsToContents()
self.widok.setSortingEnabled(True)
self.widok.horizontalHeader().setStretchLastSection(True)
self.widok.setSelectionBehavior(QAbstractItemView.SelectRows)
self.widok.setSelectionMode(QAbstractItemView.SingleSelection)
self.widget = QWidget()
self.widget.setContentsMargins(0, 0, 0, 0)
self.widget.setLayout(QVBoxLayout())
self.widget.layout().addLayout(uklad)
self.setWidget(self.widget)
....
class TabModel4(QAbstractTableModel):
""" Tabelaryczny model danych """
def __init__(self, pola=[], dane=[], parent=None):
super(TabModel4, self).__init__()
self.pola = pola
self.tabela = dane
def aktualizuj(self, dane):
""" Przypisuje źródło danych do modelu """
self.tabela = dane
def rowCount(self, parent=QModelIndex()):
""" Zwraca ilość wierszy """
return len(self.tabela)
def columnCount(self, parent=QModelIndex()):
""" Zwraca ilość kolumn """
if self.tabela:
return len(self.tabela[0])
else:
return 0
def data(self, index, rola=Qt.DisplayRole):
""" Wyświetlanie danych """
i = index.row()
j = index.column()
if rola==Qt.BackgroundColorRole:
if i%2: bgColor=QColor('#F5F5BC')
else: bgColor=QColor('#EEE8AA')
return QVariant(QColor(bgColor))
if rola == Qt.DisplayRole:
Nazwa1Edt.setText(self.tabela[i][0]+self.tabela[i][1])
AdresEdt.setText(self.tabela[i][2])
...
return '{0}'.format(self.tabela[i][j])
else:
return QVariant()
def setData(self, index, value, rola=Qt.DisplayRole):
""" Zmiana danych """
i = index.row()
j = index.column()
if rola == Qt.DisplayRole:
self.tabela[i][j] = value
def flags(self, index):
""" Zwraca właściwości kolumn tabeli """
flags = super(TabModel4, self).flags(index)
j = index.column()
if j!= 0 and j != 1 and j != 2 and j!=3 and j!=4 and j!=5:
flags |= Qt.ItemIsEditable
return flags
def headerData(self, sekcja, kierunek, rola=Qt.DisplayRole):
""" Zwraca nagłówki kolumn """
if rola == Qt.DisplayRole and kierunek == Qt.Horizontal:
return self.pola[sekcja]
elif rola == Qt.DisplayRole and kierunek == Qt.Vertical:
return sekcja + 1
else:
return QVariant()`