2012-12-27 31 views
5

Đây là một theo dõi câu hỏi để câu trả lời này: https://stackoverflow.com/a/11939294/406686:Pipe tất cả các lệnh bàn phím tự động đến một instance mplayer nhúng khi một phím modifier được nhấn trong pyqt4

Xét đoạn mã sau, mà nhúng mplayer trong một QWidget. Vấn đề là nó không phản ứng với bất kỳ phím tắt mplayer như mũi tên bên phải để tìm kiếm tiếp và như vậy.

Rõ ràng là tôi có thể thực hiện lại mọi lối tắt theo cách thủ công. Tuy nhiên có cách nào để tự động sắp xếp tất cả các chuỗi bàn phím đến trình chơi nhạc miễn là phím bổ trợ, nói ALT hoặc phím Win-Key được nhấn?

Ví dụ: Nhấn ALT + = tìm kiếm về phía trước ...

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_()) 

Trả lời

1

Tôi không chắc chắn, nếu tôi có vấn đề của bạn đúng. Bạn có thể dễ dàng thêm các phương pháp keyPressEventkeyReleaseEvent-Window Lớp của bạn:

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 

Ví dụ này sẽ chỉ làm việc với Modifier + ONE quan trọng khác. Nếu bạn cũng cần điều này cho các phím tắt phức tạp hơn, chẳng hạn như Alt +Ctrl +phím Shift +, bạn có thể cần danh sách này để tiết kiệm các phím hiện ép, nhưng ý tưởng cơ bản phải rõ ràng. Trên máy tính của tôi, phím bấm của python và nhận được từ mplayer là khác nhau, nhưng tôi sử dụng một bố trí bàn phím rất phổ biến (Neo-Layout), vì vậy đây có thể là lý do cho việc này.

+0

Cảm ơn, nhưng nó không hoạt động nếu không có thông báo lỗi. Nếu tôi in một cái gì đó trước dòng 'self .__ modifier_pressed = True' nó được in ra, khi phím bổ trợ được nhấn, nhưng nếu tôi in một cái gì đó trước' self.mplayer.run_command ("key_down_event", key) 'không có gì xảy ra, vì vậy có vẻ như phần elif không bao giờ được thực hiện ... – student

+0

Nói chung nó sẽ hoạt động khi giữ phím "Alt" -Key và sau đó nhấn một phím khác. Tôi vừa nhận ra rằng có một vấn đề chung với các phím mũi tên. Để giải quyết vấn đề này, tôi đã thêm self.setFocus() vào phương thức init, sau đó tất cả các keyPressEvents được kích hoạt. –

+1

Tôi chỉ phát hiện ra rằng event.nativeVirtualKey() có thể gửi khóa bên phải đến mplayer, không may là điều này không hoạt động đối với các phím mũi tên. Có lẽ, họ cần phải chuyển đổi thủ công thành mã khóa được yêu cầu bởi mplayer. –

Các vấn đề liên quan