[PyQt] why is mouseMoveEvent not reached in QMainWindow object

christopher.nahler at papermodels.at christopher.nahler at papermodels.at
Thu Apr 29 13:38:03 BST 2010


I have expanded my working code where I replace the central QLabel widget
with a scene and view. Now the mouse tracking works when the cursor is over
the status bar and the label in the statusbar but not over the graphics
view. But when I press the mouse button and move out of the statusbar area
into the graphics view area the tracking works. Just not when I move the
mouse without clicking over the view. I am guessing this has to do with the
rubberbanding? Or have I missed something else?

The view has setMouseTracking set to True and the scene does not have this
function. 

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

SCREEN_BORDER = 100

class GraphicsView(QGraphicsView):
    def __init__(self, parent=None):
        super(GraphicsView, self).__init__(parent)
        self.setMouseTracking(True)
        self.setDragMode(QGraphicsView.RubberBandDrag)
        
    #def wheelEvent(self, event):
        #factor = 1.41 ** (-event.delta() / 240.0)
        #self.scale(factor, factor)
        
            
class MouseCoordinates(QLabel):
    
    def __init__(self, parent=None):
        super(MouseCoordinates, self).__init__(parent)
        self.setMouseTracking(True)
        self.curPos = None
        self.setText(QString())
        self.update()
                
    def paintEvent(self, event):
        painter = QPainter(self)
        self.curPos = QCursor.pos()
        self.setText(" mouse @ %d / %d " % (self.curPos.x(),
self.curPos.y()))
        painter.drawText(self.rect(), Qt.AlignCenter, self.text())
        
        
class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setMouseTracking(True)
        
        self.scene = QGraphicsScene(self)
        self.scene.setSceneRect(QRectF(0, 0, 800, 600))
        
        # draw border
        self.scene.addRect(QRectF(0, 0, 800, 600), 
                           QPen(Qt.darkGray, 1, Qt.DotLine),
                           QBrush(Qt.lightGray))
        
        # save the current rect as parent object (canvas) for drawing
        self.background = self.scene.items()[0]
        
        myObj = QGraphicsRectItem(QRectF(100, 100, 200, 200), parent =
self.background, scene = self.scene)
        myPen = QPen(Qt.black, 1, Qt.SolidLine)
        myBrush = QBrush(Qt.white, Qt.SolidPattern)
        myObj.setFlag(QGraphicsItem.ItemIsMovable, True)
        myObj.setFlag(QGraphicsItem.ItemIsSelectable, True)
        myObj.setPen(myPen)
        myObj.setBrush(myBrush)
        
        # add view
        self.view = GraphicsView()
        # self.view.setMouseTracking(True) # set in class already
        self.view.setScene(self.scene)
        self.setCentralWidget(self.view)
        
        self.coordsLabel = MouseCoordinates()
        #self.coordsLabel.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken)
        status = self.statusBar()
        status.setMouseTracking(True)
        status.setSizeGripEnabled(False)
        status.addPermanentWidget(self.coordsLabel)
        status.showMessage("Ready", 5000)
                    
        
    def mouseMoveEvent(self, event):
        self.coordsLabel.update()
        super(MainWindow, self).mouseMoveEvent(event)         

if __name__ == "__main__":
    
    import sys
    
    # setup application object
    app = QApplication(sys.argv)
    
    # create (parent) main window
    mainWindow = MainWindow()
    rect = QApplication.desktop().availableGeometry()
    mainWindow.setGeometry(rect.x() + SCREEN_BORDER, 
                           rect.y() + SCREEN_BORDER, 
                           rect.width() - 2 * SCREEN_BORDER, 
                           rect.height() - 2 * SCREEN_BORDER)
    mainWindow.setMinimumSize(900, 700)
   
mainWindow.setWindowIcon(QIcon("D:\UDaten\pyqt\chap12\DesignerTest.bmp"))
    mainWindow.setWindowTitle("DesignerTest")
    mainWindow.show()
    
    # run application object
    sys.exit(app.exec_())


More information about the PyQt mailing list