Python PyQT5在矩形中添加标签和图标

Python PyQT5在矩形中添加标签和图标,python,qt,user-interface,pyqt5,grid,Python,Qt,User Interface,Pyqt5,Grid,我有一个矩形列表,可以这样做: import sys from PyQt5.QtCore import Qt, QRect, QRectF from PyQt5.QtGui import * from PyQt5.QtWidgets import ( QGridLayout, QWidget, QApplication, QGraphicsScene, QGraphicsView, QGraphicsProxyWidget, QGraphics

我有一个矩形列表,可以这样做:

import sys
from PyQt5.QtCore import Qt, QRect, QRectF
from PyQt5.QtGui import *
from PyQt5.QtWidgets import ( QGridLayout, QWidget, QApplication, QGraphicsScene, 
                         QGraphicsView, QGraphicsProxyWidget, QGraphicsRectItem
                         )  

class WidRect(QWidget):    
    def __init__(self, mIntMeasureId,mStrLabel=None):
        super().__init__()
        self.aIntMeasureId=mIntMeasureId
        self.aStrLabel=mStrLabel
        #self.setWidget(QLabel(mStrLabel))
    
    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == Qt.LeftButton:
            print("Left Button Clicked on measure "+ str(self.aIntMeasureId))
        elif QMouseEvent.button() == Qt.RightButton:
                #do what you want here
            print("Right Button Clicked on measure "+ str(self.aIntMeasureId))

class MeasureGrid(QWidget):

    #grid = None
    #scene = None

    def __init__(self, geometry, parent=None):
        super(MeasureGrid, self).__init__(parent=parent)
        
        #super().onclick.connec(self.click)

        self.aLayMeasureGrid = QGridLayout(self)

        self.aGsMeasureScene = QGraphicsScene(self)
        self.aGsMeasureScene .setSceneRect(geometry.x(), geometry.y(), geometry.width(), geometry.height())
        self.aGsMeasureScene .setBackgroundBrush(Qt.white)

        self.aGvMeasureView = QGraphicsView()
        self.aGvMeasureView.setScene(self.aGsMeasureScene )

        self.aLayMeasureGrid.addWidget(self.aGvMeasureView)
        
        
        for i in range(1,5):

            rect = QRectF(100*i, 20, 80, 140)
            self.addRect(rect,i)


    def addRect(self, mRecMeasureBox,mIntMeasureNum):

        #label = QLabel("World")
        #label.setAlignment(Qt.AlignCenter | Qt.AlignCenter)
        
        
        wrRectBox = WidRect(mIntMeasureNum,"Meas #" + str(mIntMeasureNum)) 

        ### CREA IL PROXY ###
        gpqProxMeasure = QGraphicsProxyWidget()
        gpqProxMeasure.setWidget(wrRectBox)
        gpqProxMeasure.setGeometry(mRecMeasureBox)
        self.aGsMeasureScene.addItem(gpqProxMeasure)

        ### CREA L'OGGETTO GENITORE ###
        griMeasure = QGraphicsRectItem(mRecMeasureBox)
        #rectangle.setFlag(QGraphicsItem.ItemIsMovable, True)
        self.aGsMeasureScene.addItem(griMeasure)
        gpqProxMeasure.setParentItem(griMeasure)
   

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mgMeasureList = MeasureGrid(QRect(10, 10, 550, 280))       
    mgMeasureList.show()
    app.exec_()
我想补充一点:

  • 将文本插入每个矩形中
  • 每个矩形中都有一个图标
  • 如果我用右键单击,则用另一个图标更改图标
  • 我尝试添加QLabel,但无法将小部件添加到小部件

    你能告诉我我的错误在哪里吗


    我使用代理对象创建矩形,因为在应用程序的最终版本中,它们将是100到300个对象。

    Mmmh。你是在尝试创建某种“歌曲视图”,对吗?在任何情况下,您都没有向
    WidRect
    添加任何内容,参数只是实例属性,在QGraphicsView上使用QWidget作为自定义对象通常是毫无意义的,只需创建QGraphicsSitem子类并自行绘制,否则,使用QGraphicsWidget,其布局包含QGraphicsPixmapItem和QGraphicsSimpleTextItem。是的,这是一种歌曲视图。我使用QWidget是因为我必须管理鼠标点击,而我不能用其他方式来做。您能演示如何使用这些类吗?所有QGraphicsItem子类都支持鼠标事件,只需实现MousePresseEvent。好的,我将很快尝试使用这些类!谢谢:)