QLabel può fare già tutto quello di cui hai bisogno, questo è un esempio minimale, ci sono svariati esempi su come mostrare un'immagine in una QLabel online, puoi approfondire il resto con una ricerca su google.
codice:
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtCore import Qt
import sys

class Rect(QLabel):
    def __init__(self, w=200, h=100, color="red", text="", callback=None):
        super().__init__()
        self.setFixedSize(w, h)
        self.setStyleSheet("QLabel {background-color: "+color+";}")
        self.setText(text)
        self.setAlignment(Qt.AlignCenter)
        if callback==None:
            callback = lambda x: None
        self.callback = callback
    
    def mousePressEvent(self, e):
        self.callback(e)

app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()
layout.addWidget(Rect())
layout.addWidget(Rect(400, 200, "yellow", "rosa", lambda e: print("yellow")))
layout.addWidget(Rect(300, 150, "blue", "rosae", lambda e:print("blue")))
window.setLayout(layout)
window.setWindowTitle("Rects")
window.show()
sys.exit(app.exec_())