在窗口中,我构造了QDockWidget类的对象和QAbstractTableModel类的对象。该对象以不同的方式在SQL中显示来自表的相同数据。当我在对象QAbstractTableModel中标记该行时,相应的数据显示在对象QDockWidget中。当我用鼠标标记该行时,它起作用了,但是当我(从键盘上)通过箭头在表格上移动时,我遇到了问题。当我向下移动箭头时,它可以正常工作,但是如果我向上移动,则在类QDockWidget的对象中显示的数据与在对象QAbstractTableModel的标记行中显示的数据不同。那是对象QAbstractTableModel中前一行的数据。为什么这样工作?我想要-上下移动时数据将始终相同,在类QAbstractTableModel中标记为行的数据形式将显示在对象QDockWidget中。
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的对象中显示的数据与在对象QAbstractTableModel的标记行中显示的数据不同。那是对象QAbstractTableModel中前一行的数据。为什么这样工作?我想要-上下移动时数据始终是相同的,类QAbstractTableModel对象中标记行的数据将显示在对象QDockWidget中。
答案 0 :(得分:0)
我解决了这个问题。我自定义了QTableView类,该类在类中使用并定义了keyPressEvent函数,这对您有所帮助。我以前定义了此函数,但在wron类中,我将其放在QAbstractTableModel中。