2013-12-16 13 views
1

我正在使用python 2.7和Qt4。我需要在ctrl + F鍵盤按下後找到對話框。我正在使用這段代碼進行測試,但我想這個方法從來沒有在我的課堂上執行過。如果你能指導我,我將不勝感激。Python中的擊鍵事件

我的第一個問題是,當按下鍵時,根本不會調用此方法! 其次,如何將兩個按鍵組合在一起,如ctrl和F. 第三,如何調用對話框。 我在新的蟒蛇,我很感激,如果你能幫我出...

def find(self, event): 
    print("I am here") 
    key = event.key() 
    if QtGui.QApplication.keyboardModifiers() == QtCore.Qt.ControlModifier: 
     #show find dialog 
     reply=QMessageBox.question(self,'Message',"Find Dialog",QMessageBox.Yes|QMessageBox.No,QMessageBox.No) 
     if reply==QMessageBox.Yes: 
      event.accept() 
     else: 
      event.ignore() 
+0

以此作爲關鍵枚舉的引用:http://pyqt.sourceforge.net/Docs/PyQt4/ qt.html#Key-enum –

+0

謝謝,我怎樣才能使用擊鍵組合? –

+0

使用'Qt.KeyboardModifier',如果按下控件,它將包含'Qt.ControlModifier'。從http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#KeyboardModifier-enum –

回答

2

通常的方法來設置快捷鍵在菜單中是QAction;或者如果沒有菜單,則使用QShortcut

鍵序列本身(例如Ctrl + F)可以用QKeySequence構建。

下面的腳本顯示了兩種不同的方式來建立一個快捷方式打開一個對話框:

from PyQt4 import QtCore, QtGui 

class Window(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     menu = self.menuBar().addMenu('&File') 
     action = menu.addAction('&Open') 
     action.setShortcut(QtGui.QKeySequence('Ctrl+F')) 
     action.triggered.connect(self.handleFind) 
     shortcut = QtGui.QShortcut(QtGui.QKeySequence('F3'), self) 
     shortcut.activated.connect(self.handleFind) 
     label = QtGui.QLabel(self) 
     label.setText('<center>Press Ctrl+F or F3<center>') 
     self.setCentralWidget(label) 

    def handleFind(self): 
     reply = QtGui.QMessageBox.question(
      self, 'Message', 'Find Dialog', 
      QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) 
     if reply == QtGui.QMessageBox.Yes: 
      print('Yes') 
     else: 
      print('No') 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 300, 300, 200) 
    window.show() 
    sys.exit(app.exec_()) 
+0

感謝您的完美回覆..一個問題:如果我有Qwidget而不是QMainWindow會怎麼樣?因爲我嘗試過,但小部件沒有任何屬性'menuBar' –

+1

可以將[QMenuBar](https://qt-project.org/doc/qt-4.8/qmenubar.html)添加到其他小部件,但它會這樣做是不尋常的,而且正確實施更加困難。但是,如果您不需要菜單欄,則只需使用QShortcut即可。儘管如此,儘管如此,最好也是最簡單的選擇是將QWidget換成QMainWindow。 – ekhumoro

+0

Tnx,我可以通過使用QShortCut來解決它。 –

1

爲F鍵的枚舉是Qt.Key_F,不Qt.F

對於控制,你可以做這樣的事情:

if QtGui.QApplication.keyboardModifiers() == QtCore.Qt.ControlModifier: 

,或者,如果你想忽略其他鍵盤功能鍵,這樣做:

if QtGui.QApplication.keyboardModifiers() | QtCore.Qt.ControlModifier == QtCore.Qt.ControlModifier: 
+0

謝謝..我嘗試了所有,但我的問題仍然沒有解決! –

+0

你打算髮布這個問題嗎? –

+0

該方法根本沒有執行,我已將該打印消息打印(「我在這裏」)進行測試。但通過按鍵,我沒有看到我的控制檯中的消息。 –