2012-12-23 41 views
3

请考虑以下最简单的示例。如何在下拉代码中的注释中指出在放置事件期间按下修饰键时如何修改它,以及是否执行其他操作。假设你从鹦鹉螺或类似的东西中删除一个文件到我的例子中。使用修改键在pyqt4中拖放

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class MyDropLabel(QLabel): 
    myDroppedSignal = pyqtSignal(str)  
    myDroppedSignalModified = pyqtSignal()  

    def __init__(self,text): 
     super(MyDropLabel, self).__init__(text) 
     self.setAcceptDrops(True) 

    def dragMoveEvent(self, e): 
     e.accept() 

    def dragEnterEvent(self, e): 
     e.accept() 

    def dropEvent(self, e): 
     if e.mimeData().hasUrls(): 
      s = e.mimeData().urls()[0].path() 
      self.myDroppedSignal.emit(s) 
     e.accept() 

##if a modifier key, for example shift or ctrl was pressed to something else and emit myDroppedSignalModified 




class MyWidget(QWidget): 


    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 
     self.hlayout = QHBoxLayout() 
     self.setLayout(self.hlayout) 
     self.label = MyDropLabel("Drop something here") 
     self.hlayout.addWidget(self.label) 
     #self.setCentralWidget(self.label) 

     self.label.myDroppedSignal.connect(self.myDroppedHandler) 

    def myDroppedHandler(self,s): 
     self.label.setText(QString(s)) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    da = MyWidget() 
    da.show() 
    sys.exit(app.exec_()) 

回答

1

可以,例如,通过installEventFilter(QObject * filterObj)设置self.keyIsPressed状态筛选您定义的QEvent.KeyPress

这是使用QApplication.keyboardModifiers一个例子:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import os 

import sip 
sip.setapi('QString', 2) 
sip.setapi('QVariant', 2) 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class droppableLabel(QLabel): 
    fileDropped = pyqtSignal(list) 

    def __init__(self, type, parent=None): 
     super(droppableLabel, self).__init__(parent) 
     self.setAcceptDrops(True) 

    def dragEnterEvent(self, event): 
     if event.mimeData().hasUrls: 
      event.accept() 

     else: 
      event.ignore() 

    def dragMoveEvent(self, event): 
     if event.mimeData().hasUrls: 
      event.setDropAction(Qt.CopyAction) 
      event.accept() 

     else: 
      event.ignore() 

    def dropEvent(self, event): 
     if event.mimeData().hasUrls: 
      event.setDropAction(Qt.CopyAction) 
      event.accept() 
      links = [] 
      for url in event.mimeData().urls(): 
       links.append(str(url.toLocalFile())) 

      self.fileDropped.emit(links) 

     else: 
      event.ignore() 

class droppableWidget(QWidget): 
    def __init__(self, parent=None): 
     super(droppableWidget, self).__init__(parent) 

     self.label = droppableLabel(self) 
     self.label.fileDropped.connect(self.on_label_fileDropped) 
     self.label.setText("Press CTRL/SHIFT/None and drop some files here") 
     self.label.setMinimumSize(QSize(40, 100)) 

     self.verticalLayout = QVBoxLayout(self) 
     self.verticalLayout.addWidget(self.label) 
     self.verticalLayout.setMargin(0) 

    @pyqtSlot(list) 
    def on_label_fileDropped(self, fileNames): 
     droppedFiles = [ fileName 
          for fileName in fileNames 
          if os.path.exists(fileName) 
          ] 

     if droppedFiles: 
      keyModifiers = QApplication.keyboardModifiers() 
      if keyModifiers == Qt.ShiftModifier: 
       print "SHIFT" 
       formatter = "\n"     

      elif keyModifiers == Qt.ControlModifier: 
       print "CTRL" 
       formatter = "," 

      else: 
       print "NONE" 
       formatter = "|" 

      self.label.setText(formatter.join(droppedFiles)) 

if __name__ == "__main__": 
    import sys 

    app = QApplication(sys.argv) 
    main = droppableWidget() 
    main.show() 
    sys.exit(app.exec_()) 
+0

谢谢,但我想我需要一些更多的细节,因为我是一个初学者。你能用我最小的例子来实现你的想法吗? – student

+0

@student结帐[我的回复](http://stackoverflow.com/a/14022417/1006989),我添加了一个例子,将说明它 – 2012-12-24 16:16:21

+0

谢谢,我试了一下,并修改它为我的实际代码,它工作得很漂亮好。由于我是一名pyqt4初学者,并且想要学习新的东西,所以如果你能够更详细地解释你的例子中的@ pyqtSlot这个东西,那将是非常好的。 – student