In the sample code below (heavily influenced from here), I want the entire row of the clicked cell to be selected instead of the individual cell. How can I change the code to incorporate that?
import re import operator import os import sys import sqlite3 import cookies from PyQt4.QtCore import * from PyQt4.QtGui import * def main(): app = QApplication(sys.argv) w = MyWindow() w.show() sys.exit(app.exec_()) class MyWindow(QWidget): def __init__(self, *args): QWidget.__init__(self, *args) # data self.tabledata = [('apple', 'red', 'small'), ('apple', 'red', 'medium'), ('apple', 'green', 'small'), ('banana', 'yellow', 'large')] self.header = ['fruit', 'color', 'size'] # create table self.createTable() # layout layout = QVBoxLayout() layout.addWidget(self.tv) self.setLayout(layout) def createTable(self): # create the view self.tv = QTableView() self.tv.setStyleSheet("gridline-color: rgb(191, 191, 191)") # set the table model tm = MyTableModel(self.tabledata, self.header, self) self.tv.setModel(tm) # set the minimum size self.tv.setMinimumSize(400, 300) # hide grid self.tv.setShowGrid(True) # set the font font = QFont("Calibri (Body)", 12) self.tv.setFont(font) # hide vertical header vh = self.tv.verticalHeader() vh.setVisible(False) # set horizontal header properties hh = self.tv.horizontalHeader() hh.setStretchLastSection(True) # set column width to fit contents self.tv.resizeColumnsToContents() # set row height nrows = len(self.tabledata) for row in xrange(nrows): self.tv.setRowHeight(row, 18) # enable sorting self.tv.setSortingEnabled(True) class MyTableModel(QAbstractTableModel): def __init__(self, datain, headerdata, parent=None, *args): """ datain: a list of lists headerdata: a list of strings """ QAbstractTableModel.__init__(self, parent, *args) self.arraydata = datain self.headerdata = headerdata def rowCount(self, parent): return len(self.arraydata) def columnCount(self, parent): return len(self.arraydata[0]) def data(self, index, role): if not index.isValid(): return QVariant() elif role != Qt.DisplayRole: return QVariant() return QVariant(self.arraydata[index.row()][index.column()]) def headerData(self, col, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole: return QVariant(self.headerdata[col]) return QVariant() def sort(self, Ncol, order): """Sort table by given column number. """ self.emit(SIGNAL("layoutAboutToBeChanged()")) self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol)) if order == Qt.DescendingOrder: self.arraydata.reverse() self.emit(SIGNAL("layoutChanged()")) if __name__ == "__main__": main()
That turned out to be easier than I thought. Simply adding this row makes the selection to be by row instead of cell.
self.tv.setSelectionBehavior(QAbstractItemView.SelectRows)
In PyQt5 SelectRows
has moved. The code is now:
self.tv.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With