#include #include "ColorDialog.h" #include "ui_ColorDialog.h" class ColorDialog::ColorSetting { public: Ui::ColorDialog ui; int m_iHue; int m_iSaturation; int m_iBrightness; bool m_bPressed; QPoint m_ptPress; public: ColorSetting() : m_iHue(0) , m_iSaturation(0) , m_iBrightness(0) , m_bPressed(false) { } ~ColorSetting() { } private: }; ColorDialog::ColorDialog(QColor cr,bool bAlpha,QWidget *parent) : QWidget(parent) , m_pSetting(new ColorSetting) , m_bNotEdit(false) { m_pSetting->ui.setupUi(this); m_pSetting->ui.basicColorWgt->initColorItems(bAlpha); m_pSetting->ui.hLabel->setVisible(false); m_pSetting->ui.hSpinBox->setVisible(false); m_pSetting->ui.sLabel->setVisible(false); m_pSetting->ui.sSpinBox->setVisible(false); m_pSetting->ui.vLabel->setVisible(false); m_pSetting->ui.vSpinBox->setVisible(false); setAttribute(Qt::WA_DeleteOnClose); //标题 m_pTitleLbl = new QLabel(this); m_pTitleLbl->setText(tr("Select color")); m_pTitleLbl->setStyleSheet("background-color:rgba(206,206,206,255);color:rgba(0,0,0,255);"); //m_pTitleLbl->setFixedSize(190, 34); // m_pTitleLbl->setStyleSheet("background-color:rgba(216,216,0,255);"); // m_pTitleLbl->setStyleSheet("color:rgba(0,0,0,255);"); m_pSetting->ui.topWgt->setStyleSheet("background-color:rgba(206,206,206,255);"); //关闭按钮 m_pCloseBtn = new QPushButton(this); m_pCloseBtn->setFixedSize(22, 34); m_pCloseBtn->setObjectName("m_pCloseBtn"); m_pCloseBtn->setVisible(false); m_buttonRole = Yes; setWindowFlags(Qt::FramelessWindowHint | Qt::Window); setWindowModality(Qt::WindowModal); //setAttribute(Qt::WA_TranslucentBackground); this->installEventFilter(this); QRegExp rx("(\\d?[a-f]?){0,6}"); m_pSetting->ui.colorEdit->setValidator(new QRegExpValidator(rx, this)); m_pSetting->ui.colorEdit->setText("00000000"); this->setFocusPolicy(Qt::ClickFocus); initSignalAndSlotConn(); setStyleSheet("QSpinBox::arrow{background-color:#8d8d8d;}"); m_pSetting->ui.okBtn->setProperty("ssType", "progManageTool"); m_pSetting->ui.okBtn->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); m_pSetting->ui.cancelBtn->setProperty("ssType", "progManageTool"); m_pSetting->ui.cancelBtn->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); m_pSetting->ui.addCustomColorBtn->setProperty("ssType", "progManageTool"); m_pSetting->ui.addCustomColorBtn->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); if(bAlpha==false) { m_pSetting->ui.aSpinBox->setVisible(false); m_pSetting->ui.label_2->setVisible(false); m_pSetting->ui.line->setVisible(false); // m_pSetting->ui.line_2->setVisible(false); cr.setAlpha(255); } m_pSetting->ui.previewWgt->setCurColor(cr); colorItemSelcSlot(cr); } ColorDialog::~ColorDialog() { delete m_pSetting; } ColorDialog::ButtonRole ColorDialog::showDialog() { show(); QEventLoop evtLoop; m_pEvtLoop = &evtLoop; evtLoop.exec(); m_pEvtLoop = NULL; hide(); return m_buttonRole; } void ColorDialog::setCurColor(const QColor &c) { colorItemSelcSlot(c); } QColor ColorDialog::getColor() { QColor color; color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); return color; } QRgb ColorDialog::getRgb() { QColor color; color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); return color.rgb(); } QColor ColorDialog::getRgba() { return m_pSetting->ui.previewWgt->getNewColor(); } bool ColorDialog::eventFilter(QObject *obj, QEvent *ev) { switch (ev->type()) { case QEvent::MouseButtonPress: { QMouseEvent *e = dynamic_cast(ev); if (e->pos().y() > 29) { return false; } if (e->buttons() & Qt::LeftButton) { m_pSetting->m_bPressed = true; m_pSetting->m_ptPress = e->globalPos() - this->frameGeometry().topLeft(); } } break; case QEvent::MouseButtonRelease: { m_pSetting->m_bPressed = false; } break; case QEvent::MouseMove: { QMouseEvent *e = dynamic_cast(ev); if (m_pSetting->m_bPressed) { move(this->mapToGlobal(e->pos() - m_pSetting->m_ptPress)); } } break; case QEvent::Resize: { m_pTitleLbl->move(8, 0); m_pCloseBtn->move(width() - 24, -8); } break; default: break; } return QWidget::eventFilter(obj, ev); } void ColorDialog::show() { QWidget::show(); } void ColorDialog::initSignalAndSlotConn() { connect(m_pSetting->ui.hColorWgt, SIGNAL(hueChangedSignal(int)), m_pSetting->ui.svColorWgt, SLOT(hueChangedSlot(int))); connect(m_pSetting->ui.svColorWgt, SIGNAL(svChangedSignal(int, int, int)), m_pSetting->ui.previewWgt, SLOT(svChangedSlot(int, int, int))); //选中色预览窗 connect(m_pSetting->ui.previewWgt, SIGNAL(svChangedSignal(int, int, int)), this, SLOT(updateEditData(int, int, int))); connect(m_pSetting->ui.basicColorWgt, SIGNAL(colorItemSelcSignal(const QColor &)), this, SLOT(colorItemSelcSlot(const QColor &))); connect(m_pSetting->ui.customColorWgt, SIGNAL(colorItemSelcSignal(const QColor &)), this, SLOT(colorItemSelcSlot(const QColor &))); connect(m_pSetting->ui.colorEdit, SIGNAL(textEdited(const QString &)), this, SLOT(editChangedSlot(const QString &))); connect(m_pSetting->ui.colorEdit, SIGNAL(editingFinished()), this, SLOT(editFinishedSlot())); connect(m_pSetting->ui.addCustomColorBtn, SIGNAL(clicked()), this, SLOT(addCustomColorSlot())); connect(m_pSetting->ui.okBtn, SIGNAL(clicked()), this, SLOT(okBtnClickedSlot())); connect(m_pSetting->ui.cancelBtn, SIGNAL(clicked()), this, SLOT(cancelBtnClickedSlot())); connect(m_pCloseBtn, SIGNAL(clicked()), this, SLOT(cancelBtnClickedSlot())); // connect(m_pSetting->ui.hSpinBox, SIGNAL(valueChanged(int)), this, SLOT(hValueChangedSlot(int))); // connect(m_pSetting->ui.sSpinBox, SIGNAL(valueChanged(int)), this, SLOT(sValueChangedSlot(int))); // connect(m_pSetting->ui.vSpinBox, SIGNAL(valueChanged(int)), this, SLOT(vValueChangedSlot(int))); connect(m_pSetting->ui.rSpinBox, SIGNAL(valueChanged(int)), this, SLOT(rValueChangedSlot(int))); connect(m_pSetting->ui.gSpinBox, SIGNAL(valueChanged(int)), this, SLOT(gValueChangedSlot(int))); connect(m_pSetting->ui.bSpinBox, SIGNAL(valueChanged(int)), this, SLOT(bValueChangedSlot(int))); connect(m_pSetting->ui.aSpinBox, SIGNAL(valueChanged(int)), this, SLOT(aValueChangedSlot(int))); } void ColorDialog::updateRGBColor(const QColor &color) { m_pSetting->ui.previewWgt->setNewColor(color); m_pSetting->ui.rSpinBox->setValue(color.red()); m_pSetting->ui.gSpinBox->setValue(color.green()); m_pSetting->ui.bSpinBox->setValue(color.blue()); m_pSetting->ui.aSpinBox->setValue(color.alpha()); QString strR = QString::number(color.red(), 16); QString strG = QString::number(color.green(), 16); QString strB = QString::number(color.blue(), 16); QString strA = QString::number(color.alpha(), 16); if(strR.length()==1) strR.prepend("0"); if(strG.length()==1) strG.prepend("0"); if(strB.length()==1) strB.prepend("0"); if(strA.length()==1) strA.prepend("0"); QString strRgb = strR+strG+strB+strA; m_pSetting->ui.colorEdit->setText(strRgb); } void ColorDialog::colorItemSelcSlot(const QColor &c) { if(c==Qt::transparent) { m_bNotEdit = true; m_pSetting->ui.hColorWgt->setHue(c.hue()); m_pSetting->ui.svColorWgt->setColor(c); m_pSetting->ui.aSpinBox->setValue(0); m_bNotEdit = false; } else { m_bNotEdit = true; m_pSetting->ui.hColorWgt->setHue(c.hue()); m_pSetting->ui.svColorWgt->setColor(c); m_pSetting->ui.aSpinBox->setValue(c.alpha()); m_bNotEdit = false; } } void ColorDialog::addCustomColorSlot() { QColor color(m_pSetting->ui.rSpinBox->value(),m_pSetting->ui.gSpinBox->value(),m_pSetting->ui.bSpinBox->value(),m_pSetting->ui.aSpinBox->value()); // color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); // color.setH(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); // color.setRgba(m_pSetting->ui.aSpinBox->value(),m_pSetting->ui.aSpinBox->value(),m_pSetting->ui.aSpinBox->value(),m_pSetting->ui.aSpinBox->value())); m_pSetting->ui.customColorWgt->setGivenColor(m_pSetting->ui.previewWgt->getNewColor()); } void ColorDialog::okBtnClickedSlot() { QColor color; color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); m_pSetting->ui.previewWgt->setCurColor(color); m_buttonRole = Yes; if (m_pEvtLoop != NULL) { m_pEvtLoop->exit(); } } void ColorDialog::cancelBtnClickedSlot() { m_buttonRole = No; if (m_pEvtLoop != NULL) { m_pEvtLoop->exit(); } } void ColorDialog::editChangedSlot(const QString &strColor) { m_bNotEdit = true; int r, g, b; int a=255; switch (strColor.length()) { case 0: { r = g = b = 0; } break; case 1: case 2: { r = g = 0; bool ok; b = strColor.toInt(&ok, 16); } break; case 3: { QString strR = QString("%1%2").arg(strColor.left(1), strColor.left(1)); QString strG = QString("%1%2").arg(strColor.mid(1, 1), strColor.mid(1, 1)); QString strB = QString("%1%2").arg(strColor.right(1), strColor.right(1)); bool ok; r = strR.toInt(&ok, 16); g = strG.toInt(&ok, 16); b = strB.toInt(&ok, 16); } break; case 4: { r = 0; QString strG = QString("%1").arg(strColor.left(2)); QString strB = QString("%1").arg(strColor.right(2)); bool ok; g = strG.toInt(&ok, 16); b = strB.toInt(&ok, 16); } break; case 5: { QString strR = QString("%1").arg(strColor.left(1)); QString strG = QString("%1").arg(strColor.mid(1, 2)); QString strB = QString("%1").arg(strColor.right(2)); bool ok; r = strR.toInt(&ok, 16); g = strG.toInt(&ok, 16); b = strB.toInt(&ok, 16); } break; case 6: { QString strR = QString("%1").arg(strColor.left(2)); QString strG = QString("%1").arg(strColor.mid(2, 2)); QString strB = QString("%1").arg(strColor.right(2)); bool ok; r = strR.toInt(&ok, 16); g = strG.toInt(&ok, 16); b = strB.toInt(&ok, 16); } break; case 8: { QString strR = QString("%1").arg(strColor.left(2)); QString strG = QString("%1").arg(strColor.mid(2, 2)); QString strB = QString("%1").arg(strColor.mid(2,2)); QString strA = QString("%1").arg(strColor.right(2)); bool ok; r = strR.toInt(&ok, 16); g = strG.toInt(&ok, 16); b = strB.toInt(&ok, 16); a = strA.toInt(&ok, 16); } break; default: break; } QColor color; color.setRgb(r, g, b , a); int h, s, v; h = m_pSetting->m_iHue = color.hue(); s = m_pSetting->m_iSaturation = color.saturation(); v = m_pSetting->m_iBrightness = color.value(); m_pSetting->ui.hColorWgt->setHue(h); m_pSetting->ui.svColorWgt->setHsv(h, s, v); m_pSetting->ui.previewWgt->setNewColor(color); m_pSetting->ui.hSpinBox->setValue(h); m_pSetting->ui.sSpinBox->setValue(s); m_pSetting->ui.vSpinBox->setValue(v); m_pSetting->ui.rSpinBox->setValue(r); m_pSetting->ui.gSpinBox->setValue(g); m_pSetting->ui.bSpinBox->setValue(b); m_pSetting->ui.aSpinBox->setValue(a); m_bNotEdit = false; } void ColorDialog::editFinishedSlot() { QString strColor = m_pSetting->ui.colorEdit->text(); switch (strColor.length()) { case 0: { m_pSetting->ui.colorEdit->setText("000000ff"); } break; case 1: { m_pSetting->ui.colorEdit->setText(strColor.prepend("00000")); } break; case 2: { m_pSetting->ui.colorEdit->setText(strColor.prepend("0000")); } break; case 3: { QString strR = QString("%1%2").arg(strColor.left(1), strColor.left(1)); QString strG = QString("%1%2").arg(strColor.mid(1, 1), strColor.mid(1, 1)); QString strB = QString("%1%2").arg(strColor.right(1), strColor.right(1)); m_pSetting->ui.colorEdit->setText(strR.append(strG).append(strB)); } break; case 4: { QString strG = QString("%1").arg(strColor.left(2)); QString strB = QString("%1").arg(strColor.right(2)); m_pSetting->ui.colorEdit->setText(strG.append(strB).prepend("00")); } break; case 5: { QString strR = QString("%1").arg(strColor.left(1)); QString strG = QString("%1").arg(strColor.mid(1, 2)); QString strB = QString("%1").arg(strColor.right(2)); m_pSetting->ui.colorEdit->setText(strR.append(strG).append(strB).prepend("0")); } break; case 6: { return; } break; default: break; } } void ColorDialog::hValueChangedSlot(int h) { if (m_bNotEdit) { return; } m_bNotEdit = true; m_pSetting->m_iHue = h; m_pSetting->ui.hColorWgt->setHue(h); QColor color; color.setHsv(h, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); m_pSetting->ui.svColorWgt->setHue(h); updateRGBColor(color); m_bNotEdit = false; } void ColorDialog::sValueChangedSlot(int s) { if (m_bNotEdit) { return; } m_bNotEdit = true; m_pSetting->m_iSaturation = s; QColor color; color.setHsv(m_pSetting->m_iHue, s, m_pSetting->m_iBrightness); m_pSetting->ui.svColorWgt->setSaturation(s); updateRGBColor(color); m_bNotEdit = false; } void ColorDialog::vValueChangedSlot(int v) { if (m_bNotEdit) { return; } m_bNotEdit = true; m_pSetting->m_iBrightness = v; QColor color; color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, v); m_pSetting->ui.svColorWgt->setBrightness(v); updateRGBColor(color); m_bNotEdit = false; } void ColorDialog::rValueChangedSlot(int r) { if (m_bNotEdit) { return; } m_bNotEdit = true; int iGreen = m_pSetting->ui.gSpinBox->value(); int iBlue = m_pSetting->ui.bSpinBox->value(); int ialpha = m_pSetting->ui.aSpinBox->value(); QColor color; color.setRgb(r, iGreen, iBlue,ialpha); int h = m_pSetting->m_iHue = color.hue(); int s = m_pSetting->m_iSaturation = color.saturation(); int v = m_pSetting->m_iBrightness = color.value(); m_pSetting->ui.hColorWgt->setHue(h); m_pSetting->ui.svColorWgt->setHsv(h, s, v); m_pSetting->ui.previewWgt->setNewColor(color); m_pSetting->ui.hSpinBox->setValue(h); m_pSetting->ui.sSpinBox->setValue(s); m_pSetting->ui.vSpinBox->setValue(v); QString strR = QString::number(r, 16); QString strG = QString::number(iGreen, 16); QString strB = QString::number(iBlue, 16); QString strA = QString::number(ialpha, 16); if(strR.length()==1) strR.prepend("0"); if(strG.length()==1) strG.prepend("0"); if(strB.length()==1) strB.prepend("0"); if(strA.length()==1) strA.prepend("0"); QString strRgb = strR+strG+strB+strA; // QString("%1%2%3%4").arg(QString("%1").arg(strR.size() == 1 ? strR.prepend("0") : strR), // QString("%1").arg(strG.size() == 1 ? strG.prepend("0") : strG), // QString("%1").arg(strB.size() == 1 ? strB.prepend("0") : strB), // QString("%1").arg(strA.size() == 1 ? strB.prepend("0") : strA) ); m_pSetting->ui.colorEdit->setText(strRgb); m_bNotEdit = false; } void ColorDialog::gValueChangedSlot(int g) { if (m_bNotEdit) { return; } m_bNotEdit = true; int iRed = m_pSetting->ui.rSpinBox->value(); int iBlue = m_pSetting->ui.bSpinBox->value(); int ialpha = m_pSetting->ui.aSpinBox->value(); QColor color; color.setRgb(iRed, g, iBlue,ialpha); int h = m_pSetting->m_iHue = color.hue(); int s = m_pSetting->m_iSaturation = color.saturation(); int v = m_pSetting->m_iBrightness = color.value(); m_pSetting->ui.hColorWgt->setHue(h); m_pSetting->ui.svColorWgt->setHsv(h, s, v); m_pSetting->ui.previewWgt->setNewColor(color); m_pSetting->ui.hSpinBox->setValue(h); m_pSetting->ui.sSpinBox->setValue(s); m_pSetting->ui.vSpinBox->setValue(v); QString strR = QString::number(iRed, 16); QString strG = QString::number(g, 16); QString strB = QString::number(iBlue, 16); QString strA = QString::number(ialpha, 16); if(strR.length()==1) strR.prepend("0"); if(strG.length()==1) strG.prepend("0"); if(strB.length()==1) strB.prepend("0"); if(strA.length()==1) strA.prepend("0"); QString strRgb = strR+strG+strB+strA; m_pSetting->ui.colorEdit->setText(strRgb); m_bNotEdit = false; } void ColorDialog::bValueChangedSlot(int b) { if (m_bNotEdit) { return; } m_bNotEdit = true; int iRed = m_pSetting->ui.rSpinBox->value(); int iGreen = m_pSetting->ui.gSpinBox->value(); int ialpha = m_pSetting->ui.aSpinBox->value(); QColor color; color.setRgb(iRed, iGreen, b,ialpha); int h = m_pSetting->m_iHue = color.hue(); int s = m_pSetting->m_iSaturation = color.saturation(); int v = m_pSetting->m_iBrightness = color.value(); m_pSetting->ui.hColorWgt->setHue(h); m_pSetting->ui.svColorWgt->setHsv(h, s, v); m_pSetting->ui.previewWgt->setNewColor(color); m_pSetting->ui.hSpinBox->setValue(h); m_pSetting->ui.sSpinBox->setValue(s); m_pSetting->ui.vSpinBox->setValue(v); QString strR = QString::number(iRed, 16); QString strG = QString::number(iGreen, 16); QString strB = QString::number(b, 16); QString strA = QString::number(ialpha, 16); if(strR.length()==1) strR.prepend("0"); if(strG.length()==1) strG.prepend("0"); if(strB.length()==1) strB.prepend("0"); if(strA.length()==1) strA.prepend("0"); QString strRgb = strR+strG+strB+strA; m_pSetting->ui.colorEdit->setText(strRgb); m_bNotEdit = false; } void ColorDialog::aValueChangedSlot(int a) { int iRed = m_pSetting->ui.rSpinBox->value(); int iGreen = m_pSetting->ui.gSpinBox->value(); int iBlue = m_pSetting->ui.bSpinBox->value(); QColor color; color.setRgb(iRed, iGreen, iBlue,a); m_pSetting->ui.previewWgt->setNewColor(color); QString strR = QString::number(iRed, 16); QString strG = QString::number(iGreen, 16); QString strB = QString::number(iBlue, 16); QString strA = QString::number(a, 16); if(strR.length()==1) strR.prepend("0"); if(strG.length()==1) strG.prepend("0"); if(strB.length()==1) strB.prepend("0"); if(strA.length()==1) strA.prepend("0"); QString strRgb = strR+strG+strB+strA; m_pSetting->ui.colorEdit->setText(strRgb); m_bNotEdit = false; } void ColorDialog::updateEditData(int h, int s, int v) { m_bNotEdit = true; m_pSetting->m_iHue = h; m_pSetting->m_iSaturation = s; m_pSetting->m_iBrightness = v; QColor color; color.setHsv(h, s, v); m_pSetting->ui.hSpinBox->setValue(h); m_pSetting->ui.sSpinBox->setValue(s); m_pSetting->ui.vSpinBox->setValue(v); m_pSetting->ui.rSpinBox->setValue(color.red()); m_pSetting->ui.gSpinBox->setValue(color.green()); m_pSetting->ui.bSpinBox->setValue(color.blue()); QString strR = QString::number(color.red(), 16); QString strG = QString::number(color.green(), 16); QString strB = QString::number(color.blue(), 16); QString strA = QString::number(m_pSetting->ui.aSpinBox->value(), 16); if(strR.length()==1) strR.prepend("0"); if(strG.length()==1) strG.prepend("0"); if(strB.length()==1) strB.prepend("0"); if(strA.length()==1) strA.prepend("0"); QString strRgb = strR+strG+strB+strA; m_pSetting->ui.colorEdit->setText(strRgb); // QString strRgb = QString("%1%2%3%4").arg(QString("%1").arg(strR.size() == 1 ? strR.prepend("0") : strR), // QString("%1").arg(strG.size() == 1 ? strG.prepend("0") : strG), // QString("%1").arg(strB.size() == 1 ? strB.prepend("0") : strB), // QString("%1").arg(strA.size() == 1 ? strB.prepend("0") : strA) ); // m_pSetting->ui.colorEdit->setText(strRgb); m_bNotEdit = false; }