Hi, the attached script exhibits a strange behaviour which can be reproduced as follows:
- run the script and enlarge the table. Keep the vertical scrollbar visible
- select a range of cells with the mouse, for instance top_left=(0,2) and
bottom_right=(2,3).
- now drag the slider downwards until the selection disappears *completely*
and upwards until it appears again
- now click on any unselected cell (or select a new range of cells). By doing
it I expected that the complete selection would be cleared and the clicked
cell would become current and selected. Instead only the previous current cell
is deselected. The rest of the old selection remains selected and also the new
clicked cell is selected and current
- repeat the previous step as many times as you want. The behaviour is always
the same
Is this a bug or am I doing something wrong?
I'm using PyQt4.8.3 and Python 2.7 on a Debian testing box.
TIA,
Vicent
::
Share what you know, learn what you don't
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, parent=None):
super(TableModel, self).__init__(parent)
self.nrows = 30
self.ncols = 4
def rowCount(self, index=QtCore.QModelIndex()):
if not index.isValid():
return self.nrows
else:
return 0
def columnCount(self, index=QtCore.QModelIndex()):
if not index.isValid():
return self.ncols
else:
return 0
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid() or not (0 <= index.row() < self.nrows):
return None
cell = index.row() + index.column()
if role == QtCore.Qt.DisplayRole:
return cell
elif role == QtCore.Qt.TextAlignmentRole:
return int(QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
else:
return None
class TableView(QtGui.QTableView):
def __init__(self, parent=None):
super(TableView, self).__init__(parent)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.tmodel = TableModel()
self.setModel(self.tmodel)
self.selection_model = self.selectionModel()
self.setSelectionMode(QtGui.QAbstractItemView.ContiguousSelection)
self.vscrollbar = self.verticalScrollBar()
self.selection_model.selectionChanged.connect(self.trackSelection)
self.vscrollbar.sliderMoved.connect(self.updateView)
def updateView(self, *value):
self.selection_model.selectionChanged.disconnect()
self.selection_model.clearSelection()
top_left = self.tmodel.index(self.top_left[0], self.top_left[1])
bottom_right = self.tmodel.index(self.bottom_right[0], self.bottom_right[1])
selection = QtGui.QItemSelection(top_left, bottom_right)
self.selection_model.select(selection, QtGui.QItemSelectionModel.Select)
self.selection_model.selectionChanged.connect(self.trackSelection)
def trackSelection(self, selected, deselected):
# Get the selection range of the selection model
selection = self.selection_model.selectedIndexes()
cells = [[i.row(), i.column()] for i in selection]
self.top_left = min(cells)
self.bottom_right = max(cells)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
view = TableView()
view.show()
app.exec_()
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ PyQt mailing list [email protected] http://www.riverbankcomputing.com/mailman/listinfo/pyqt
