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