2015-01-28 7 views
1

Qt.ItemIsEnabled 플래그를 설정하면 QTableView 항목을 편집 할 수 있습니다. 항목의 편집 모드를 시작하려면 사용자가 해당 항목을 두 번 클릭하기 만하면됩니다. 항목을 편집하는 또 다른 방법은 항목을 선택하고 키보드 키를 누르는 것입니다. 두 번째 방법으로 항목의 편집 모드를 비활성화하는 방법은 무엇입니까? 여기 QTableView를 두 번 클릭 할 때만 편집 모드로 전환하는 방법

선택한 항목으로 QTableView을 보여주는 이미지 :

enter image description here

즉시 사용자가 선택한 항목이 편집 모드에 이미 키보드 키를 누를 같이

enter image description here

이 기본 QTableView 동작으로 인해 함수 바로 가기를 정의 할 수 없습니다. 링크 된 바로 가기 함수를 트리거하는 대신 QListView의 항목이 전자 diting 모드 .... 더블 클릭시에만 QTableView가 편집 모드로 들어가게하는 방법은 무엇입니까?

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 = ['Item_A_001','Item_A_002','Item_B_001','Item_B_002'] 

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

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

     row=index.row() 
     if row<len(self.items): 
      return QVariant(self.items[row]) 
     else: 
      return QVariant() 
    def flags(self, index): 
     return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable 

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

     tableModel=Model(self)    

     self.view=QTableView(self) 
     self.view.setModel(tableModel) 
     self.view.horizontalHeader().setResizeMode(QHeaderView.Stretch) 

     layout = QVBoxLayout(self) 
     layout.addWidget(self.view) 
     self.setLayout(layout) 

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

답변

3

QTableView에서 짝수 처리기 keyPressEvent을 다시 구현해야합니다. 이렇게하려면 사용자 정의 QTableView 클래스를 작성하고 내부에 이벤트 핸들러를 다시 구현할 수 있습니다.

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

#Your new customized QTableView 
class CustomQTableView(QTableView):  
    def __init__(self, *args, **kwargs): 
     QTableView.__init__(self, *args, **kwargs) #Use QTableView constructor 

    def keyPressEvent(self, event): #Reimplement the event here, in your case, do nothing 
     return 

class Model(QAbstractTableModel): 
    def __init__(self, parent=None, *args): 
     QAbstractTableModel.__init__(self, parent, *args) 
     self.items = ['Item_A_001','Item_A_002','Item_B_001','Item_B_002'] 

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

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

     row=index.row() 
     if row<len(self.items): 
      return QVariant(self.items[row]) 
     else: 
      return QVariant() 
    def flags(self, index): 
     return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable 


class MyWindow(QWidget): 
    def __init__(self, *args): 
     QWidget.__init__(self, *args) 
     print "c" 
     tableModel=Model(self)    

     self.view=CustomQTableView(self) #Call your custom QTableView here 
     self.view.setModel(tableModel) 
     self.view.horizontalHeader().setResizeMode(QHeaderView.Stretch) 

     layout = QVBoxLayout(self) 
     layout.addWidget(self.view) 
     self.setLayout(layout) 

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

이렇게하면 keyPressEvent는 덮어 쓰여지고 아무 일도 일어나지 않지만 두 번 클릭 이벤트는 그대로 유지됩니다.

+0

감사합니다. 간단한 솔루션을 위해 DrHaze! – alphanumeric

2

더 나은 해결책은 원하는 편집 트리거를 설정하는 것입니다. QTableView는 QAbstractItemView에서 상속되므로 void setEditTriggers (EditTriggers 트리거)를 사용할 수 있습니다. 사용자 정의 QTableView의 코드는 다음과 같습니다.

from PyQt4.QtGui import QAbstractItemView, QTableView 

class CustomQTableView(QTableView):  
    def __init__(self, *args): 
     super().__init__(*args) 
     self.setEditTriggers(QAbstractItemView.NoEditTriggers | 
          QAbstractItemView.DoubleClicked) 
관련 문제