2011-11-07 30 views
5

Tôi đang chuyển đổi một chương trình lớn hơn của QGraphicsItems thành QGraphicsWidgets (hãy gọi chúng là mục và tiện ích để nhập vì lợi ích). Di chuột di chuột không thành công vì vị trí và/hoặc trực tiếp của các tiện ích không giống với các mục cũ. Tôi đã đun sôi xuống một trường hợp đơn giản với một cái nhìn, cảnh, một mục và một widget. Mục màu xanh hiển thị ở điểm ảnh 100x50 và hoverEnterEvent xuất hiện như mong đợi. Tuy nhiên, tiện ích màu đỏ được hiển thị ở một nửa chiều rộng dự định. Tôi có thể sửa lỗi này nếu tôi triển khai lại hàm boundingRect ảo thuần túy cho tiện ích nhưng sự kiện di chuột vẫn chỉ được kích hoạt trên đỉnh 50x50 bên trái. Tôi cần sử dụng phương pháp pos/rect/geometry nào để sử dụng/ghi đè để tiện ích tương tác với chuột giống như mục? Cảm ơn. Dưới đây là mẫu của tôi đangQt/PyQt: QGraphicsItem và QGraphicsWidget hình học, vị trí, tương tác chuột

#!/usr/local/bin/python 

import os, sys 
from PyQt4.Qt import * 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class MyView(QGraphicsView): 
    def __init__(self): 
     QGraphicsView.__init__(self) 
     self.setWindowFlags(Qt.WindowStaysOnTopHint) 
     self.scene = QGraphicsScene(self) 
     self.item = GraphicsItem('item', 100, 50) 
     self.item.moveBy(50, 50) 
     self.scene.addItem(self.item) 
     self.widget = GraphicsWidget('widget', 100, 50) 
     self.scene.addItem(self.widget) 
     self.setScene(self.scene) 

class GraphicsItem(QGraphicsItem): 
    def __init__(self, name, width, height): 
     QGraphicsItem.__init__(self) 
     self.setAcceptHoverEvents(True) 
     self.name = name 
     self.__width = width 
     self.__height = height 

    def boundingRect(self): 
     return QRectF(0, 0, self.__width, self.__height) 

    def hoverEnterEvent(self, event): 
     self.__printGeometryDetails() 

    def paint(self, painter, option, widget): 
     bgRect = self.boundingRect() 
     painter.drawRects(bgRect) 
     painter.fillRect(bgRect, QColor('blue')) 

    def __printGeometryDetails(self): 
     print self.name 
     print ' pos (%.0f, %0.0f)' % (self.pos().x(), self.pos().y()) 
     print ' boundingRect (%.0f, %0.0f, %.0f, %0.0f)' % (self.boundingRect().x(), self.boundingRect().y(), self.boundingRect().width(), self.boundingRect().height()) 

class GraphicsWidget(QGraphicsWidget): 
    def __init__(self, name, width, height): 
     QGraphicsWidget.__init__(self) 
     self.setAcceptHoverEvents(True) 
     self.name = name 
     self.__width = width 
     self.__height = height 

    def boundingRect(self): 
     return QRectF(0, 0, self.__width, self.__height) 

    def hoverEnterEvent(self, event): 
     self.__printGeometryDetails() 

    def paint(self, painter, option, widget): 
     bgRect = self.boundingRect() 
     painter.drawRects(bgRect) 
     painter.fillRect(bgRect, QColor('red')) 

    def __printGeometryDetails(self): 
     print self.name 
     print ' pos (%.0f, %0.0f)' % (self.pos().x(), self.pos().y()) 
     print ' boundingRect (%.0f, %0.0f, %.0f, %0.0f)' % (self.boundingRect().x(), self.boundingRect().y(), self.boundingRect().width(), self.boundingRect().height()) 
     print ' geometry (%.0f, %0.0f, %.0f, %0.0f)' % (self.geometry().x(), self.geometry().y(), self.geometry().width(), self.geometry().height()) 
     print ' rect (%.0f, %0.0f, %.0f, %0.0f)' % (self.rect().x(), self.rect().y(), self.rect().width(), self.rect().height()) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    view = MyView() 
    view.setGeometry(600, 100, 400, 370) 
    view.show() 
    sys.exit(app.exec_()) 

Trả lời

5

Nó dường như để làm việc một cách chính xác nếu bạn sử dụng self.resize(width, height) thay vì xác định lại boundingRect.

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