Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我对QAbstractTableModel类的对象有问题_Python_Pyqt - Fatal编程技术网

Python 我对QAbstractTableModel类的对象有问题

Python 我对QAbstractTableModel类的对象有问题,python,pyqt,Python,Pyqt,在窗口中,我构造了QDockWidget类的对象和QabStretctTableModel类的对象。这些对象以不同的方式显示SQL表中的相同数据。当我在对象QAbstractTableModel中标记行时,相应的数据显示在对象QDockWidget中。当我用鼠标标记行时,它工作,但当我用箭头(从键盘)在表格上移动时,我就有问题了。当我按箭头向下移动时,它工作正常,但如果我向上移动,QDockWidget类的object中显示的数据与object QabStretctTableModel中标记行中

在窗口中,我构造了QDockWidget类的对象和QabStretctTableModel类的对象。这些对象以不同的方式显示SQL表中的相同数据。当我在对象QAbstractTableModel中标记行时,相应的数据显示在对象QDockWidget中。当我用鼠标标记行时,它工作,但当我用箭头(从键盘)在表格上移动时,我就有问题了。当我按箭头向下移动时,它工作正常,但如果我向上移动,QDockWidget类的object中显示的数据与object QabStretctTableModel中标记行中显示的数据不同。这是对象QAbstractTableModel中上一行的数据。为什么会这样?我想要-当我向上或向下移动时,数据总是相同的,类QAbstractTableModel的对象中标记为row的数据表单将显示在对象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类的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()`