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_())