2012-09-04 43 views
1

我想了解PyQt4中的事件處理,並偶然發現 keyPressEvent在更改類定義後看到除箭頭鍵之外的所有鍵。從QGraphicsView到QMainWindow現在keyPressEvent沒有看到箭頭鍵

看見所有的鍵:

class MaskWindow(QtGui.QGraphicsView): 
    def __init__(self): 
     QtGui.QGraphicsView.__init__(self) 

     self.deskTop = QtGui.QDesktopWidget() 
     self.scene = QtGui.QGraphicsScene(self) 

爲了看不到方向鍵,頁面向下和向上,但其他如工作標籤一個 - ž

class MaskWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint| 
            QtCore.Qt.FramelessWindowHint)    

     self.deskTop = QtGui.QDesktopWidget() 
     self.view = QtGui.QGraphicsView(self) 
     self.scene = QtGui.QGraphicsScene(self) 

這裏就是箭頭鍵不捕獲了關鍵的處理程序:

def keyPressEvent(self, event): 
    key = event.key() 
    if key == QtCore.Qt.UpArrow 
     self.diameter += 1 
    if key == QtCore.Qt.DownArrow: 
     self.diameter -= 1 

我是怎麼與懷念班級變化?

+0

這是因爲要傳遞給構造函數的窗口標誌幾乎可以肯定。你在哪個平臺上? – ekhumoro

+0

這是在Windows 7上。我選擇了QMainWindow,因此我可以將窗口設置爲頂部並丟失邊框。有沒有辦法用QGraphicsView對象來做到這一點? – Dave

+0

請忽略我之前的評論,並在下面查看我的答案。 – ekhumoro

回答

2

重新實現keyPressEvent函數使用了錯誤的枚舉常量。

應該使用QtCore.Qt.Key枚舉:

class MaskWindow(QtGui.QGraphicsView): 
    def __init__(self): 
     QtGui.QGraphicsView.__init__(self) 
     self.setWindowFlags(self.windowFlags() | 
      QtCore.Qt.WindowStaysOnTopHint | 
      QtCore.Qt.FramelessWindowHint) 

更新

def keyPressEvent(self, event): 
    key = event.key() 
    if key == QtCore.Qt.Key_Up: 
     self.diameter += 1 
    if key == QtCore.Qt.Key_Down: 
     self.diameter -= 1 

和窗口,標誌可以在任何部件(包括QGraphicsView)使用setWidowFlags功能被改變

重新實現的原因在你的例子中,不能和QMainWindow一起工作,因爲它不會再獲得任何關鍵事件 - 它們會用鍵盤焦點轉到子部件。

之一來解決這種方式將您希望從中獲取關鍵事件的小部件設置event filter

class MaskWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self, None, 
      QtCore.Qt.WindowStaysOnTopHint | 
      QtCore.Qt.FramelessWindowHint) 
     self.view = QtGui.QGraphicsView(self) 
     self.view.installEventFilter(self) 
     self.setCentralWidget(self.view) 

    def eventFilter(self, source, event): 
     if (source is self.view and 
      event.type() == QtCore.QEvent.KeyPress): 
      key = event.key() 
      if key == QtCore.Qt.Key_Up: 
       self.diameter += 1 
      elif key == QtCore.Qt.Key_Down: 
       self.diameter -= 1 
     return QtGui.QMainWindow.eventFilter(self, source, event) 
+0

謝謝,你的建議使用GraphicsView窗口標誌。我仍然不清楚爲什麼QMainWindow方法沒有按照您的建議將QtCore.Qt.UpArrow更改爲QtCore.Qt.Key_Up後捕獲箭頭鍵。這從好奇心來看更多。 – Dave

+0

@Dave。我已經用更完整的解釋更新了我的答案。 – ekhumoro

+0

非常好,我想我得到了大部分,除了QtGui.QMainWindow.eventFilter(自我,源,事件)結束。最後一行的原因是什麼? – Dave