tableViewBug

#!/usr/bin/env python

# -*- coding: utf8 -*-

# some imports :

from __future__ import print_function

import sys

# display infos :

PYTHONVERSION = sys.version_info[0] * 10 + sys.version_info[1]

print(‘PYTHONVERSION :‘, PYTHONVERSION)

# PyQt or PySide ?

PYSIDE = False

if not("PYQT" in sys.argv):

try:

from PySide import QtCore, QtGui

PYSIDE = True

except:

pass

if PYSIDE:

import PySide

print(‘PYSIDE‘, PySide.__version__)

else:

import sip

sip.setapi(‘QString‘, 2)

sip.setapi(‘QVariant‘, 2)

from PyQt4 import QtCore, QtGui

print(‘PYQT‘, QtCore.PYQT_VERSION_STR)

# display Qt version :

QTVERSION = QtCore.qVersion()

print(‘QTVERSION :‘, QTVERSION)

class TestModel(QtGui.QStandardItemModel):

def __init__(self, parent=None):

super(TestModel, self).__init__(parent)

self.headers = [‘id‘, ‘firstname‘, ‘lastname‘]

self.datas = []

self.datas.append([‘101‘, ‘Danny‘, ‘Young‘])

self.datas.append([‘102‘, ‘Christine‘, ‘Holand‘])

self.datas.append([‘103‘, ‘Lars‘, ‘Gordon‘])

self.datas.append([‘104‘, ‘Roberto‘, ‘Robitaille‘])

self.datas.append([‘105‘, ‘Maria‘, ‘Papadopoulos‘])

self.emptyRow = []

nbCols = len(self.headers)

self.setColumnCount(nbCols)

nbRows = len(self.datas)

self.setRowCount(nbRows)

for col in range(nbCols):

self.setHeaderData(col, QtCore.Qt.Horizontal, self.headers[col])

for row in range(nbRows):

for col in range(nbCols):

data = self.datas[row][col]

self.setData(self.index(row, col, QtCore.QModelIndex()), data)

def data(self, index, role=QtCore.Qt.DisplayRole):

column, row = index.column(), index.row()

if role == QtCore.Qt.TextAlignmentRole:

if column > 0:

return QtCore.Qt.AlignLeft

else:

return QtCore.Qt.AlignRight

elif role == QtCore.Qt.DisplayRole:

return self.datas[row][column]

return

def columnCount(self, parent=QtCore.QModelIndex()):

return len(self.headers)

def rowCount(self, parent=QtCore.QModelIndex()):

return len(self.datas)

class MainForm(QtGui.QDialog):

def __init__(self, parent=None):

super(MainForm, self).__init__(parent)

self.model = TestModel()

self.tableView = QtGui.QTableView()

self.tableView.setModel(self.model)

insertRowButton = QtGui.QPushButton("InsertRow")

insertRowButton.clicked.connect(self.insertRow)

removeRowBugButton = QtGui.QPushButton("RemoveRowBug")

removeRowBugButton.clicked.connect(self.removeRowBug)

removeRowButton = QtGui.QPushButton("RemoveRow")

removeRowButton.clicked.connect(self.removeRow)

quitButton = QtGui.QPushButton("Quit")

quitButton.clicked.connect(self.accept)

buttonLayout = QtGui.QHBoxLayout()

buttonLayout.addWidget(insertRowButton)

buttonLayout.addWidget(removeRowBugButton)

buttonLayout.addWidget(removeRowButton)

buttonLayout.addStretch()

buttonLayout.addWidget(quitButton)

splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)

self.vbox = QtGui.QVBoxLayout()

self.vbox.addWidget(self.tableView)

widget = QtGui.QWidget()

widget.setLayout(self.vbox)

splitter.addWidget(widget)

layout = QtGui.QVBoxLayout()

layout.addWidget(splitter)

layout.addLayout(buttonLayout)

self.setLayout(layout)

self.setMinimumWidth(400)

def insertRow(self):

index = self.tableView.currentIndex()

if index.isValid():

row = index.row()

column = index.column()

else:

row, column = 0, 0

if self.model.insertRow(row):

emptyRow = [‘999‘, ‘AAA‘, ‘Zzzzzzzzzzz‘]

row += 1

self.model.datas.insert(row, emptyRow)

index = self.model.index(row, column)

self.tableView.setFocus()

self.tableView.setCurrentIndex(index)

def removeRowBug(self):

index = self.tableView.currentIndex()

if not index.isValid():

return

row = index.row()

column = index.column()

if (self.model.removeRow(row)):

self.model.datas.pop(row)

if row > self.model.rowCount() - 1:

row -= 1

# QTableView.verticalHeader is not repaint

# this for verify verticalHeader :

print(self.model.rowCount(), self.tableView.verticalHeader().count())

# I test that but nothing is ok :

#self.tableView.resizeRowsToContents()

#self.tableView.verticalHeader().reset()

#self.tableView.verticalHeader().repaint()

QtCore.QCoreApplication.processEvents()

index = self.model.index(row, column)

self.tableView.setFocus()

self.tableView.setCurrentIndex(index)

def removeRow(self):

index = self.tableView.currentIndex()

if not index.isValid():

return

row = index.row()

column = index.column()

if (self.model.removeRow(row)):

self.model.datas.pop(row)

if row > self.model.rowCount() - 1:

row -= 1

# recreate the tableView solve the bug, but is not good :

self.vbox.removeWidget(self.tableView)

self.tableView.setModel(None)

del self.tableView

self.tableView = QtGui.QTableView()

self.tableView.setModel(self.model)

self.vbox.addWidget(self.tableView)

index = self.model.index(row, column)

self.tableView.setFocus()

self.tableView.setCurrentIndex(index)

if __name__ == ‘__main__‘:

app = QtGui.QApplication(sys.argv)

form = MainForm()

form.show()

sys.exit(app.exec_())

时间: 2024-08-05 11:09:57

tableViewBug的相关文章

pyqt tableViewBug(网友提供)

#!/usr/bin/env python # -*- coding: utf8 -*- # some imports : from __future__ import print_function import sys # display infos : PYTHONVERSION = sys.version_info[0] * 10 + sys.version_info[1] print('PYTHONVERSION :', PYTHONVERSION) # PyQt or PySide ?