2017-10-16 24 views
1

Donc l'idée est que je devrais être capable de lancer le script, sélectionner une partie de l'écran, puis appuyer sur Entrée (ou sinon le déclencher) pour enregistrer la sélection.PyQt5 Saisir et enregistrer la section de l'écran

J'ai un peu du code d'autres messages et d'autres choses, mais maintenant je suis coincé. Je peux sélectionner n'importe quelle partie de l'écran et redimensionner au besoin, mais je n'arrive pas à l'obtenir pour reconnaître la touche "Entrée". En ce moment la fonction "keyPressEvent" est juste censée imprimer un message donc je sais que ça a marché, mais je n'ai rien. Des idées?

import sys 
from PyQt5 import QtGui, QtCore, QtWidgets 
from PyQt5.QtCore import Qt, QPoint, QRect, QSize 
from PyQt5.QtGui import QScreen 
from PyQt5.QtWidgets import QApplication, QLabel, QRubberBand 


class MyLabel(QtWidgets.QLabel): 

    def __init__(self, parent=None): 
     QtWidgets.QLabel.__init__(self, parent) 
     self.selection = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self) 


    def keyPressEvent(self, qKeyEvent): 
     print(qKeyEvent.key()) 
     if qKeyEvent.key() == QtCore.Qt.Key_Return: 
      print('Enter pressed') 
     else: 
      super().keyPressEvent(qKeyEvent) 

    def mousePressEvent(self, event): 
     ''' 
      Mouse is pressed. If selection is visible either set dragging mode (if close to border) or hide selection. 
      If selection is not visible make it visible and start at this point. 
     ''' 

     if event.button() == QtCore.Qt.LeftButton: 

      position = QtCore.QPoint(event.pos()) 
      if self.selection.isVisible(): 
       # visible selection 
       if (self.upper_left - position).manhattanLength() < 20: 
        # close to upper left corner, drag it 
        self.mode = "drag_upper_left" 
       elif (self.lower_right - position).manhattanLength() < 20: 
        # close to lower right corner, drag it 
        self.mode = "drag_lower_right" 
       else: 
        # clicked somewhere else, hide selection 
        self.selection.hide() 
      else: 
       # no visible selection, start new selection 
       self.upper_left = position 
       self.lower_right = position 
       self.mode = "drag_lower_right" 
       self.selection.show() 

    def mouseMoveEvent(self, event): 
     ''' 
      Mouse moved. If selection is visible, drag it according to drag mode. 
     ''' 

     if self.selection.isVisible(): 
      # visible selection 
      if self.mode is "drag_lower_right": 
       self.lower_right = QtCore.QPoint(event.pos()) 
      elif self.mode is "drag_upper_left": 
       self.upper_left = QtCore.QPoint(event.pos()) 
      # update geometry 
      self.selection.setGeometry(QtCore.QRect(self.upper_left, self.lower_right).normalized()) 


class mainUI(QtWidgets.QWidget): 

    def __init__(self): 
     super(mainUI, self).__init__() 
     self.initUI() 

    def initUI(self): 
     layout = QtWidgets.QVBoxLayout(self) 

     label = MyLabel(self) 
     pixmap = QScreen.grabWindow(app.primaryScreen(), app.desktop().winId()) 
     label.setPixmap(pixmap) 
     layout.addWidget(label) 

     self.setLayout(layout) 

     geometry = app.desktop().availableGeometry() 

     self.setFixedSize(geometry.width(), geometry.height()) 

     # self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) 
     self.show() 


if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 

    window = mainUI() 

    sys.exit(app.exec_()) 

EDIT

Bon ce code fonctionne, mais pour être honnête, je ne suis pas 100% sûr pourquoi.

import sys 
from PyQt5 import QtGui, QtCore, QtWidgets 
from PyQt5.QtCore import Qt, QPoint, QRect, QSize 
from PyQt5.QtGui import QScreen 
from PyQt5.QtWidgets import QApplication, QLabel, QRubberBand, QAction 

class KpeWindow(QtWidgets.QLabel): 
    def __init__(self, parent=None): 
     QtWidgets.QLabel.__init__(self,parent) 
     main = QtWidgets.QVBoxLayout(self) 
     self.selection = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self) 

     # label = QLabel(self) 
     # label.setText('Test the keyPressEvent') 
     # main.addWidget(label) 

     # self.adjustSize() 
     # self.setLayout(main) 

    def keyPressEvent(self, event): 
     print(event.key()) 
     if event.key() == QtCore.Qt.Key_Return: 
      print('yay') 

     #QtWidgets.QMessageBox.warning(self, 'MDI', 'keyPressEvent') 
     self.parent().keyPressEvent(event) 


    def mousePressEvent(self, event): 
     ''' 
      Mouse is pressed. If selection is visible either set dragging mode (if close to border) or hide selection. 
      If selection is not visible make it visible and start at this point. 
     ''' 
     print(event) 
     if event.button() == QtCore.Qt.LeftButton: 

      position = QtCore.QPoint(event.pos()) 
      if self.selection.isVisible(): 
       # visible selection 
       if (self.upper_left - position).manhattanLength() < 20: 
        # close to upper left corner, drag it 
        self.mode = "drag_upper_left" 
       elif (self.lower_right - position).manhattanLength() < 20: 
        # close to lower right corner, drag it 
        self.mode = "drag_lower_right" 
       else: 
        # clicked somewhere else, hide selection 
        self.selection.hide() 
      else: 
       # no visible selection, start new selection 
       self.upper_left = position 
       self.lower_right = position 
       self.mode = "drag_lower_right" 
       self.selection.show() 

    def mouseMoveEvent(self, event): 
     ''' 
      Mouse moved. If selection is visible, drag it according to drag mode. 
     ''' 

     if self.selection.isVisible(): 
      # visible selection 
      if self.mode is "drag_lower_right": 
       self.lower_right = QtCore.QPoint(event.pos()) 
      elif self.mode is "drag_upper_left": 
       self.upper_left = QtCore.QPoint(event.pos()) 
      # update geometry 
      self.selection.setGeometry(QtCore.QRect(self.upper_left, self.lower_right).normalized()) 

class MainWindow(QtWidgets.QWidget): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     QtWidgets.QMainWindow.__init__(self) 
     #self.setWindowTitle('KeyPressEvent Test') 
     # main = QtWidgets.QVBoxLayout(self) 
     # child = KpeWindow(self) 
     # child.setFocusPolicy(Qt.StrongFocus) 
     # self.setFocusProxy(child) 
     # main.addWidget(child) 
     # child.setFocus(True) 

     layout = QtWidgets.QVBoxLayout(self) 

     label = KpeWindow(self) 
     pixmap = QScreen.grabWindow(app.primaryScreen(), app.desktop().winId()) 
     label.setPixmap(pixmap) 
     layout.addWidget(label) 
     #new 
     label.setFocusPolicy(Qt.StrongFocus) 
     self.setFocusProxy(label) 
     label.setFocus(True) 

     self.setLayout(layout) 

     geometry = app.desktop().availableGeometry() 

     self.setFixedSize(geometry.width(), geometry.height()) 


     # self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) 
     self.show() 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    mainWin = MainWindow() 
    mainWin.show() 
    sys.exit(app.exec_()) 

Répondre

1

Vous devez set the focus policy sur l'étiquette pour obtenir les événements du clavier:

class MyLabel(QtWidgets.QLabel): 

    def __init__(self, parent=None): 
     ... 
     self.setFocusPolicy(Qt.TabFocus) 
+0

Merci pour la réponse, mais il ne semble pas encore être l'impression « yay » quand j'appuyez sur Entrée. Y a-t-il autre chose que je ne comprends pas? – SuperStew

+0

@SuperStew. Cela fonctionne bien pour moi sur Linux. Quelle plate-forme êtes-vous? – ekhumoro

+0

Ahh, je suis sur Windows 7. Est-ce un de ces cas où Windows a besoin d'un travail génial? – SuperStew