2011-10-16 14 views
15

Nel seguente codice di esempio (fortemente influenzato da here), voglio che l'intera riga della cella selezionata sia selezionata invece della singola cella. Come posso cambiare il codice per incorporarlo?Come posso selezionare per righe invece di singole celle in QTableView in PyQt?

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() 

risposta

28

Che si è rivelato più facile di quanto pensassi. Semplicemente aggiungendo questa riga, la selezione deve essere fatta per riga anziché per cella.

self.tv.setSelectionBehavior(QAbstractItemView.SelectRows) 
+1

QtGui.QAbstractItemView.SelectRows se non è stato caricato QtGui – user1767754

Problemi correlati