Ok, so I was making a simple widget that had a little 32x32 png image that you can pick up and move around. I do this by setting the mouse cursor to a pixmap cursor of the image when mousePressEvent is triggered, and reverting back when mouseReleaseEvent is triggered. I also want to track the mouse with mouseMoveEvent for later functionality. For the functionality I want, the mouse needs to continue to be tracked when it leaves the widget/window (and hopefully keeps the icon). This was easier to get working than I had thought, but when I started adding functionality and incorporated it into a window I ran into some strange behavior. If I have my widget in a gridLayout with a QSpacerItem with a QSizePolicy.Expanding property and also call winId() for my widget, the tracking/cursor break when the mouse goes out of the window. The behavior is even different I move the mouse out the top vs. out the sides and bottom, as the former doesn't even resume tracking when the mouse comes back onto the window. The appended code reproduces the behavior (I'm using PyQt4.4.3 and Python2.5.2, on WindowsXP Pro). If you comment out the call to self.winId(), than the code works as expected. Also, if you leave the call to self.winId() but remove the ",QtGui.QSizePolicy.Expanding" from the QSpacerItem constructor the code works correctly. It seems that having both of them breaks something. Is this a Bug, or am I just missing something?


from PyQt4 import QtGui, QtCore
import sys

class Drag(QtGui.QLabel):
   def __init__(self, parent=None):
       QtGui.QLabel.__init__(self, parent)
       self.image = QtGui.QPixmap('dead.png')
       self.wfc = QtGui.QCursor(self.image)
       self.setPixmap(self.image)
       self.winId()
def mousePressEvent(self, event):
       print 'set'
       self.setPixmap(QtGui.QPixmap())
       self.setCursor(self.wfc)
       event.accept()
def mouseMoveEvent(self, event):
       print event.pos()
       event.accept()

   def mouseReleaseEvent(self, event):
       print 'rel'
       self.setCursor(QtCore.Qt.ArrowCursor)
       self.setPixmap(self.image)
       event.accept()


if __name__ == '__main__':
   app = QtGui.QApplication(sys.argv)
   win = QtGui.QWidget()
   lay = QtGui.QGridLayout(win)
   dw = Drag(win)
   lay.addWidget(dw)
   lay.addItem(QtGui.QSpacerItem(13,20,QtGui.QSizePolicy.Expanding), 1, 1)
   win.show()
   win.resize(200,200)
app.exec_()

from PyQt4 import QtGui, QtCore
import sys

class Drag(QtGui.QLabel):
    def __init__(self, parent=None):
        QtGui.QLabel.__init__(self, parent)
        self.image = QtGui.QPixmap('dead.png')
        self.wfc = QtGui.QCursor(self.image)
        self.setPixmap(self.image)
        self.winId()
        
    def mousePressEvent(self, event):
        print 'set'
        self.setPixmap(QtGui.QPixmap())
        self.setCursor(self.wfc)
        event.accept()
        
    def mouseMoveEvent(self, event):
        print event.pos()
        event.accept()

    def mouseReleaseEvent(self, event):
        print 'rel'
        self.setCursor(QtCore.Qt.ArrowCursor)
        self.setPixmap(self.image)
        event.accept()
  

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    win = QtGui.QWidget()
    lay = QtGui.QGridLayout(win)
    dw = Drag(win)
    lay.addWidget(dw)
    lay.addItem(QtGui.QSpacerItem(13,20,QtGui.QSizePolicy.Expanding), 1, 1)
    win.show()
    win.resize(200,200)
    
    app.exec_()
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to