[Interest] QTableView - auto check item when row is selected
Frank Rueter | OHUfx
frank at ohufx.com
Fri Jan 22 00:59:13 CET 2016
Sending again as it didn't seem to hit the list the first time:
Hi all,
I'm writing a simple table view to display a selection of files
available in a repository for the user to select for download.
Using the model/view approach I have set the item to isCheckable(True).
The one tweak in behaviour I am trying to introduce is that I'd like the
checkboxes to auto-adjust according to the respective rows selection
state, so that the user can drag over a bunch of rows to check the
boxes, rather than having to click multiple times.
So I implemented the view's selectionChanged() virtual function to drive
the checkboxes for the selected/deselected items.
This works perfectly fine, the only hiccup I'm seeing is that when
clicking on an unchecked checkbox directly, it won't be checked the
first time, only the second time, when the respective row is selected
as well, will the click cause the checkbox to be checked.
Interestingly, the culprit seems to be this block in selectionChanged():
for i in selected.indexes():
# this causes checkboxes to not be checked unless the
respective row is selected
item = self.model().itemFromIndex(i)
item.setCheckState(Qt.Checked)
I also tried adding this to no avail:
super(FileChoserView, self).selectionChanged(selected, deselected)
How can I fix this little glitch? Or should I be doing this in an
entirely different way?
Below is the entire test code (raw and in pastebin link).
Thanks in advance for any advise,
frank
http://pastebin.com/T3tSgWRr
from PySide.QtGui import *
from PySide.QtCore import *
class FileModel(QStandardItemModel):
def __init__(self, toolData, parent=None):
super(FileModel, self).__init__(parent)
self.containers = []
self.headerLabels = ['file name']
self.dataDict = toolData
self.setUp()
def setUp(self):
'''fill model with data'''
self.clear()
for row, file_ in enumerate(self.dataDict['files']):
fileItem = QStandardItem(file_['filename'])
fileItem.setCheckable(True)
font = QApplication.font()
font.setPointSize(10)
fileItem.setFont(font)
self.setItem(row, 0, fileItem)
self.setHorizontalHeaderLabels(self.headerLabels)
class FileChoserView(QTableView):
def __init__(self, parent=None):
super(FileChoserView, self).__init__(parent)
self.setSortingEnabled(True)
self.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.horizontalHeader().setStretchLastSection(True)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setContextMenuPolicy(Qt.ActionsContextMenu)
horizontalHeader = self.horizontalHeader()
self.verticalHeader().hide()
def selectionChanged(self, selected, deselected):
'''Check item when row is selected'''
for i in selected.indexes():
# this causes checkboxes to not be checked unless the
respective row is selected
self.model().itemFromIndex(i).setCheckState(Qt.Checked)
for i in deselected.indexes():
self.model().itemFromIndex(i).setCheckState(Qt.Unchecked)
if __name__ == '__main__':
import sys
app = QApplication([])
testData = {'files':[dict(filename='file_{}.zip'.format(i)) for i
in xrange(10)]}
w = FileChoserView()
model = FileModel(testData)
w.setModel(model)
w.show()
sys.exit(app.exec_())
--
ohufxLogo 50x50 <http://www.ohufx.com> *vfx compositing
<http://ohufx.com/index.php/vfx-compositing> | *workflow customisation
and consulting <http://ohufx.com/index.php/vfx-customising>* *
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160122/8dc9729d/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/png
Size: 2666 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160122/8dc9729d/attachment.png>
More information about the Interest
mailing list