2012-12-27 39 views
5

यह इस जवाब देने के लिए एक सवाल अनुवर्ती है में दबाया जाता है: https://stackoverflow.com/a/11939294/406686:पाइप सभी कुंजीपटल एक एम्बेडेड MPlayer उदाहरण के लिए स्वचालित रूप से आदेश जब संशोधक कुंजी PyQt4

निम्नलिखित कोड है, जो एक QWidget में एम प्लेयर को एम्बेड करता है पर विचार करें। समस्या यह है कि यह किसी भी mplayer कीबोर्ड शॉर्टकट्स पर प्रतिक्रिया नहीं करता है जैसे आगे की तलाश के लिए दायां तीर और इसी तरह।

यह स्पष्ट है कि मैं मैन्युअल रूप से प्रत्येक शॉर्टकट को फिर से कार्यान्वित कर सकता हूं। हालांकि एक संशोधक कुंजी के रूप में जब तक एक संशोधक कुंजी के रूप में, सभी कीबोर्ड अनुक्रमों को स्वचालित रूप से mplayer पर पाइप करने का कोई तरीका है, तो ALT या Win-Key दबाया जाता है?

उदाहरण के लिए: प्रेस एएलटी + = आगे करें ...

import mpylayer 
from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.container = QtGui.QWidget(self) 
     self.container.setStyleSheet('background: black') 
     self.button = QtGui.QPushButton('Open', self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.container) 
     layout.addWidget(self.button) 
     self.mplayer = mpylayer.MPlayerControl(
      'mplayer', ['-wid', str(self.container.winId())]) 

    def handleButton(self): 
     path = QtGui.QFileDialog.getOpenFileName() 
     if not path.isEmpty(): 
      self.mplayer.loadfile(unicode(path)) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.resize(640, 480) 
    window.show() 
    sys.exit(app.exec_()) 

उत्तर

1

मुझे यकीन नहीं कर रहा हूँ अगर मैं आपकी समस्या को अधिकार मिल गया। आप आसानी से अपने Window कक्षा के लिए keyPressEvent और keyReleaseEvent तरीकों जोड़ सकते हैं:

class Window(QtGui.QWidget): 
    def __init__(self): 
     # same code as above 
     self.setFocus() 
     self.__modifier_pressed = False 

    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Alt: 
      self.__modifier_pressed = True 
     elif self.__modifier_pressed: 
      self.mplayer.run_command("key_down_event", event.nativeVirtualKey()) 

    def keyReleaseEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Alt: 
      self.__modifier_pressed = False 

यह उदाहरण केवल संशोधक + एक अन्य प्रमुख के साथ काम करेगा। आप भी और अधिक जटिल शॉर्टकट के लिए इस, जैसे Alt + Ctrl +शिफ्ट + की जरूरत है, आप वर्तमान में दबाया कुंजी को बचाने के लिए सूचियों की जरूरत हो सकती है, लेकिन मूल विचार स्पष्ट किया जाना चाहिए।

मेरे कंप्यूटर पर, पाइथन की दबाई गई कुंजी और mplayer से प्राप्त एक अलग है, लेकिन मैं एक बहुत ही असामान्य कीबोर्ड लेआउट (Neo-Layout) का उपयोग करता हूं, इसलिए इसका कारण हो सकता है।

+0

धन्यवाद, लेकिन यह त्रुटि संदेशों के बिना काम नहीं करता है। यदि मैं लाइन 'self .__ modifier_pressed = True' से पहले कुछ प्रिंट करता हूं, तो संशोधित किया जाता है, जब संशोधक कुंजी दबाया जाता है, लेकिन अगर मैं' self.mplayer.run_command ("key_down_event", कुंजी) से पहले कुछ प्रिंट करता हूं, तो कुछ भी नहीं होता है, इसलिए ऐसा लगता है कि elif भाग कभी निष्पादित नहीं किया जाता है ... – student

+0

आम तौर पर इसे "Alt" -Key दबाकर और फिर दूसरी कुंजी दबाकर काम करना चाहिए। मुझे अभी एहसास हुआ कि तीर कुंजी के साथ एक सामान्य समस्या है। एक कामकाज के रूप में, मैंने init-method में self.setFocus() जोड़ा, तो सभी keyPressEvents सक्रिय हो जाते हैं। –

+1

मुझे अभी पता चला है, कि event.nativeVirtualKey() mplayer के लिए सही कुंजी भेज सकता है, दुर्भाग्यवश यह तीर कुंजियों के लिए काम नहीं करता है। शायद, उन्हें mplayer द्वारा आवश्यक कुंजी कोड में मैन्युअल रूप से रूपांतरित करने की आवश्यकता है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^