2015-01-16 4 views
3

Когда нажата одна из QTableView's QModelIndex, я хочу выделить целую строку тех же строк-индексов.Как выбрать строку QTableView одним щелчком мыши

Для достижения этой цели я подключить «clicked сигнал с к пользовательскому viewClicked() метод, который принимает щелкнул QModelIndex автоматически:

self.tableview=QTableView() 
self.tableview.clicked.connect(self.viewClicked) 

Внутри viewClicked(self, clickedIndex) я запрос clickedIndex» QTableView ы номер строки, его модель и общее количество столбцов):

row=clickedIndex.row() 
    model=clickedIndex.model() 
    columnsTotal=model.columnCount(None) 

Наконец, чтобы выбрать каждый индекс в строке:

for i in range(columnsTotal): self.tableview.selectRow(row) 

Проблема заключается в том, что Qt заметно замедляет обработку такого действия. Интересно, есть ли более быстрый способ, чтобы выбрать весь ряд индексов, когда один из элементов Tableview щелкают:

enter image description here

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 

class Model(QAbstractTableModel): 
    def __init__(self, parent=None, *args): 
     QAbstractTableModel.__init__(self, parent, *args) 
     self.items = ['Row0_Column0','Row0_Column1','Row0_Column2'] 

    def flags(self, index): 
     return Qt.ItemIsEnabled | Qt.ItemIsSelectable 

    def rowCount(self, parent): 
     return 1  
    def columnCount(self, parent): 
     return len(self.items) 

    def data(self, index, role): 
     if not index.isValid(): return QVariant() 
     elif role != Qt.DisplayRole: 
      return QVariant() 

     column=index.column() 
     if column<len(self.items): 
      return QVariant(self.items[column]) 
     else: 
      return QVariant() 

class MyWindow(QWidget): 
    def __init__(self, *args): 
     QWidget.__init__(self, *args) 

     tablemodel=Model(self)    

     self.tableview=QTableView() 
     self.tableview.setModel(tablemodel) 
     self.tableview.clicked.connect(self.viewClicked) 

     layout = QHBoxLayout(self) 
     layout.addWidget(self.tableview) 

     self.setLayout(layout) 

    def viewClicked(self, clickedIndex): 
     row=clickedIndex.row() 
     model=clickedIndex.model() 
     columnsTotal=model.columnCount(None) 
     for i in range(columnsTotal): 
      self.tableview.selectRow(row) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    w = MyWindow() 
    w.show() 
    sys.exit(app.exec_()) 

СПУСТЯ EDITED: REVISED РАБОЧЕГО КОДА Благодаря Неджит! :

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 

class Model(QAbstractTableModel): 
    def __init__(self, parent=None, *args): 
     QAbstractTableModel.__init__(self, parent, *args) 
     self.items = ['Row0_Column0','Row0_Column1','Row0_Column2'] 

    def flags(self, index): 
     return Qt.ItemIsEnabled | Qt.ItemIsSelectable 

    def rowCount(self, parent): 
     return 1  
    def columnCount(self, parent): 
     return len(self.items) 

    def data(self, index, role): 
     if not index.isValid(): return QVariant() 
     elif role != Qt.DisplayRole: 
      return QVariant() 

     column=index.column() 
     if column<len(self.items): 
      return QVariant(self.items[column]) 
     else: 
      return QVariant() 

class MyWindow(QWidget): 
    def __init__(self, *args): 
     QWidget.__init__(self, *args) 

     tablemodel=Model(self)    

     self.tableview=QTableView() 
     self.tableview.setModel(tablemodel) 
     self.tableview.clicked.connect(self.viewClicked) 

     self.tableview.setSelectionBehavior(QTableView.SelectRows) 

     layout = QHBoxLayout(self) 
     layout.addWidget(self.tableview) 

     self.setLayout(layout) 

    def viewClicked(self, clickedIndex): 
     row=clickedIndex.row() 
     model=clickedIndex.model() 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    w = MyWindow() 
    w.show() 
    sys.exit(app.exec_()) 

ответ

8

Вы можете использовать setSelectionBehavior функцию QTableView, чтобы установить поведение выбора для QTableView.SelectRows:

self.tableview.setSelectionBehavior(QTableView.SelectRows); 

Теперь, когда вы нажимаете на элемент, выбирается вся строка.

+0

Отличный ответ! Большое спасибо! – alphanumeric

Смежные вопросы