我对类QAbstractTableModel的对象有疑问

时间:2019-09-10 11:57:57

标签: python pyqt

在窗口中,我构造了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中。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。我自定义了QTableView类,该类在类中使用并定义了keyPressEvent函数,这对您有所帮助。我以前定义了此函数,但在wron类中,我将其放在QAbstractTableModel中。