A continuación muestro como implementar en Qt y Python un selector de color (color picker) que hereda de un QFrame.

Al hacer clic en el botón izquierdo aparece un cuadro de diálogo estandar (QColorDialog) para seleccionar un color y se actualiza el color del widget al color seleccionado. También incluye la opción de hacer clic en el botón derecho que deja un color por defecto.

cómo implementar un selector de color

Código PyQt4

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

class QColorBox(QFrame):

    colorChanged = pyqtSignal()

    def __init__(self, parent=None, defaultColor=Qt.white):
        super(QColorBox,self).__init__(parent)

        self.setStyleSheet("border-color: rgba(0,0,0,0);")
        self.__color = None
        self.__defaultColor = QColor(defaultColor)
        self.setColor(self.__defaultColor)
        self.setFixedHeight(20)
        self.setFrameStyle(1)

    def setColor(self, color):
        if color != self.__color:
            self.__color = QColor(color)
            self.setStyleSheet("background-color: %s;" % self.__color.name())
            self.colorChanged.emit()

    def color(self):
        return self.__color

    def mousePressEvent(self, e):
        if e.buttons() == Qt.LeftButton:
            color = QColorDialog.getColor(self.__color)
            if color.isValid():
                self.setColor(color)
                self.colorChanged.emit()
        elif e.button() == Qt.RightButton:
            self.setColor(self.__defaultColor)

#
# test
#

if __name__ == "__main__":
    app = QApplication([])
    c = QColorBox(defaultColor=Qt.red)
    c.show()
    app.exec_()

Código PySide6

from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QFrame, QColorDialog
from PySide6.QtGui import QColor


class QColorBox(QFrame):
    """
    Custom Qt Widget to show a choosen color.
    Left-clicking the button shows the color-chooser, while
    right-clicking resets the color to default color.
    """

    colorChanged = Signal()

    def __init__(self, parent=None, defaultColor=Qt.GlobalColor.white):
        super(QColorBox, self).__init__(parent)

        self.setStyleSheet("border-color: rgba(0,0,0,0);")
        self._color = None
        self._defaultColor = QColor(defaultColor)
        self.setColor(self._defaultColor)
        self.setFixedHeight(20)
        self.setFrameStyle(1)

    def setColor(self, color):
        if color != self._color:
            self._color = QColor(color)
            self.setStyleSheet("background-color: %s;" % self._color.name())
            self.colorChanged.emit()

    def color(self):
        return self._color

    def mousePressEvent(self, e):
        if e.buttons() == Qt.LeftButton:
            color = QColorDialog.getColor(self._color)
            if color.isValid():
                self.setColor(color)
                self.colorChanged.emit()
        elif e.button() == Qt.RightButton:
            self.setColor(self._defaultColor)

#
# test
#

if __name__ == "__main__":
    from PySide6.QtWidgets import QApplication

    app = QApplication([])
    widget = QColorBox()
    widget.show()
    widget.setColor(Qt.GlobalColor.red)
    app.exec()