自定义颜色编辑选取对话框

news2024/12/25 22:24:33

一、简介

Qt中已经有一些封装好的对话框,比如QMessageBox、QColorDialog等,使用起来快捷方便,但缺点是我们无法为它们自定义样式,所以可能难以“融入”我们的项目。既然如此,那就自己做一个把。抱着这样的想法,我设计了一个颜色编辑选取对话框。
设计界面时,我参考了photoshop的拾色器、windows的画图软件以及一个手绘控件软件mockup。
最终完成的界面如下:
在这里插入图片描述
自定义颜色编辑选取对话框,其包括以下一些功能:

  • 选取预设的基本颜色
  • 添加自定义颜色方便下次选取
  • 从颜色拾取区域选择颜色
  • 预览当前颜色和新选择的颜色
  • 查看和编辑调整颜色的 hsv、rgb 和 16 进制值

二、基本颜色控件 - BasicColorItem

#include "BasicColorItem.h"

BasicColorItem::BasicColorItem(const QColor &c, QWidget *parent)
	: QLabel(parent)
	, m_bMouseIn(false)
{
	setFixedSize(ITEM_EDGE_LENGTH, ITEM_EDGE_LENGTH);
    m_color = c;
    this->update();
}

// 设置颜色
void BasicColorItem::setColor(const QColor &c)
{
    m_color = c;
    QImage itemImg = QImage(ITEM_EDGE_LENGTH, ITEM_EDGE_LENGTH, QImage::Format_RGB32);
    QPainter painter(&itemImg);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.drawImage(0, 0, itemImg);
    painter.setPen(Qt::NoPen);
    painter.setBrush(c);
    painter.drawRect(0, 0, width(), height());
    painter.end();
    this->setPixmap(QPixmap::fromImage(itemImg));
    update();
}

// 获取颜色
QColor BasicColorItem::getColor()
{
	return m_color;
}

void BasicColorItem::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    if (m_bMouseIn)
        painter.setPen(QPen(Qt::white, 3));
    else
        painter.setPen(QPen(m_color, 0));
    painter.setBrush(m_color);
    painter.drawRect(1, 1, ITEM_EDGE_LENGTH - 3, ITEM_EDGE_LENGTH - 3);
}

void BasicColorItem::mousePressEvent(QMouseEvent *event)
{
    Q_UNUSED(event);

    emit sigItemClicked(m_color);
}

void BasicColorItem::enterEvent(QEvent *event)
{
    Q_UNUSED(event);

	m_bMouseIn = true;
    this->update();
}

void BasicColorItem::leaveEvent(QEvent *event)
{
    Q_UNUSED(event);

	m_bMouseIn = false;
    this->update();
}

基本颜色控件,用来显示不同的基本颜色,继承自QLabel,使用绘图事件来绘制自身颜色,鼠标移入则显示白色边框效果。

三、基本颜色区域 - BasicColorArea

#include "BasicColorArea.h"

BasicColorArea::BasicColorArea(QWidget *parent)
	: QWidget(parent)
{
    // 初始化网格布局
    m_pLayoutGrid = new QGridLayout(this);
    m_pLayoutGrid->setAlignment(Qt::AlignLeft | Qt::AlignTop);
    m_pLayoutGrid->setSpacing(2);
    m_pLayoutGrid->setMargin(2);
    m_pLayoutGrid->setGeometry(QRect(0,0,width(),height()));

    // 颜色列表
    QStringList colorList = {"0, 0, 0", "51, 51, 51", "102, 102, 102", "153, 153, 153", "204, 204, 204", "221, 221, 221", "238, 238, 238", "255, 255, 255",
                             "207, 42, 39", "255, 153, 0", "255, 255, 0", "0, 158, 15", "0, 255, 255", "43, 120, 228", "153, 0, 255", "255, 0, 255",
                             "234, 153, 153", "249, 203, 156", "255, 229, 153", "182, 215, 168", "162, 196, 201", "159, 197, 248", "180, 167, 214", "213, 166, 189",
                             "224, 102, 102", "246, 178, 107", "255, 217, 102", "147, 196, 125", "118, 165, 175", "111, 168, 220", "142, 124, 195", "194, 123, 160",
                             "204, 0, 0", "230, 145, 56", "241, 194, 50", "106, 168, 79", "69, 129, 142", "89, 126, 170", "103, 78, 167", "166, 77, 121",
                             "153, 0, 0", "180, 95, 6", "119, 144, 0", "56, 118, 29", "19, 79, 92", "8, 83, 148", "52, 28, 117", "116, 27, 71",
                             "102, 0, 0", "120, 63, 4", "127, 96, 0", "39, 78, 19", "12, 52, 61", "7, 55, 99", "32, 18, 77", "71, 17, 48"};
    // 对颜色名列表进行遍历
    QString color;
    QStringList strList;
    foreach(color,colorList) {
        strList = color.split(",");
        BasicColorItem *pItem11 = new BasicColorItem(QColor(strList.at(0).toInt(), strList.at(1).toInt(), strList.at(2).toInt()));
        connect(pItem11, SIGNAL(sigItemClicked(const QColor &)), this, SIGNAL(sigColorItemSel(const QColor &)));

        m_pLayoutGrid->addWidget(pItem11, m_pLayoutGrid->count()/8, m_pLayoutGrid->count()%8);
    }
}

该区域放置所有基本颜色控件,以供选取预设的基本颜色,根据颜色列表遍历创建基本颜色控件在网格布局中,可自行扩充或删减。

四、自定义颜色区域 - CustomColorArea

#include "CustomColorArea.h"

CustomColorArea::CustomColorArea(QWidget *parent)
	: QWidget(parent)
	, m_iCurIndex(0)
{
    // 初始化网格布局
    m_pLayoutGrid = new QGridLayout(this);
    m_pLayoutGrid->setAlignment(Qt::AlignLeft | Qt::AlignTop);
    m_pLayoutGrid->setSpacing(2);
    m_pLayoutGrid->setMargin(2);
    m_pLayoutGrid->setGeometry(QRect(0,0,width(),height()));

    // 调色板子界面布局
    QString color;
    QStringList strList;
    for(int i=0; i<16; i++) {
        BasicColorItem *pItem11 = new BasicColorItem(Qt::white);
        connect(pItem11, SIGNAL(sigItemClicked(const QColor &)), this, SIGNAL(sigColorItemSel(const QColor &)));

        m_pLayoutGrid->addWidget(pItem11, m_pLayoutGrid->count()/8, m_pLayoutGrid->count()%8);

        m_mapIndexToItem.insert(i, pItem11);
    }
}

// 设置自定义颜色
void CustomColorArea::setGivenColor(const QColor &c)
{
	int iIndex = m_iCurIndex % 16;
    BasicColorItem *pCurItem = m_mapIndexToItem[iIndex];
	pCurItem->setColor(c);
	m_iCurIndex++;
}

// 设置自定义项颜色
void CustomColorArea::setGivenItemColor(int iIndex, const QColor &c)
{
	BasicColorItem *pCurItem = m_mapIndexToItem[iIndex];
	pCurItem->setColor(c);
}

自定义颜色区域,用来添加自定义颜色方便下次选取,就是在一个网格布局中创建了 16 个CustomColorArea控件,如果点击了添加到自定义颜色,将新的颜色设置给m_iCurIndex所在的基本颜色控件。

五、饱和度(S)与亮度(V)区域 - SVColorArea

#include "SVColorArea.h"

SVColorArea::SVColorArea(QWidget *parent)
	: QWidget(parent)
	, m_iHue(0)
	, m_iSaturation(0)
	, m_iBrightness(0)
	, m_iAreaWidth(256)
{
    // 初始化界面
    this->setFixedSize(256, 256);

    // 创建正方形区域的pixmap
	createSVPixmap();
    // 创建亮度渐变的pixmap
	createVPixmap();
    // 更新正方形区域的pixmap
    updateSVPixmap();
}

void SVColorArea::setHue(int h)
{
	m_iHue = h;
	updateSVPixmap();
	update();
}

void SVColorArea::setSaturation(int s)
{
	m_iSaturation = s;
	update();
}

void SVColorArea::setBrightness(int v)
{
	m_iBrightness = v;
	update();
}

void SVColorArea::setHsv(int h, int s, int v)
{
	m_iHue = h;
	m_iSaturation = s;
	m_iBrightness = v;
	updateSVPixmap();
	update();
}

void SVColorArea::setColor(const QColor &c)
{
	m_iHue = c.hue();
	m_iSaturation = c.saturation();
	m_iBrightness = c.value();
	updateSVPixmap();
    emit sigSvChanged(m_iHue, m_iSaturation, m_iBrightness);
	update();
}

void SVColorArea::paintEvent(QPaintEvent *)
{
    // 画正方形的颜色区域
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing);
	painter.drawPixmap(0, 0, m_svPixmap);
	painter.drawPixmap(0, 0, m_vPixmap);

    // 画颜色选取点的圆圈(亮度>128为黑色;<128为白色;避免黑色圆圈可能在黑色背景下显示不清晰的问题)
	painter.setPen(QPen(m_iBrightness > 128 ? Qt::black : Qt::white, 2));
	QPointF selecPos = QPointF(m_iSaturation, 255 - m_iBrightness);
	painter.drawEllipse(selecPos, 6, 6);
}

void SVColorArea::mousePressEvent(QMouseEvent *ev)
{
	m_iSaturation = qBound(0, ev->x(), 255);
	m_iBrightness = qBound(0, 255 - ev->y(), 255);
    emit sigSvChanged(m_iHue, m_iSaturation, m_iBrightness);
	update();
}

void SVColorArea::mouseMoveEvent(QMouseEvent *ev)
{
	m_iSaturation = qBound(0, ev->x(), 255);
	m_iBrightness = qBound(0, 255 - ev->y(), 255);
    emit sigSvChanged(m_iHue, m_iSaturation, m_iBrightness);
	update();
}

// 创建亮度渐变的pixmap
void SVColorArea::createVPixmap()
{
	m_vPixmap = QPixmap(m_iAreaWidth, m_iAreaWidth);
	m_vPixmap.fill(Qt::transparent);
	QPainter painter(&m_vPixmap);
	painter.setRenderHint(QPainter::Antialiasing);
	painter.setCompositionMode(QPainter::CompositionMode_Source);
	QLinearGradient vGradient(0, 0, 0, m_iAreaWidth);
	vGradient.setColorAt(0, QColor(0, 0, 0, 0));
	vGradient.setColorAt(1, QColor(0, 0, 0, 255));
	painter.setPen(Qt::NoPen);
	painter.setBrush(QBrush(vGradient));
	painter.drawRect(0, 0, m_iAreaWidth, m_iAreaWidth);
}

// 创建正方形区域的pixmap
void SVColorArea::createSVPixmap()
{
	m_svPixmap = QPixmap(m_iAreaWidth, m_iAreaWidth);
	m_svPixmap.fill(Qt::transparent);
}

// 更新正方形区域的pixmap
void SVColorArea::updateSVPixmap()
{
	QColor newColor;
	newColor.setHsv(m_iHue, 255, 255);
	QPainter painter(&m_svPixmap);
	painter.setRenderHint(QPainter::Antialiasing);
	QLinearGradient svGradient(0, 0, m_iAreaWidth, 0);
	svGradient.setColorAt(1, newColor);
	svGradient.setColorAt(0, QColor("#ffffff"));
	painter.setPen(Qt::NoPen);
	painter.setBrush(QBrush(svGradient));
	painter.drawRect(0, 0, m_iAreaWidth, m_iAreaWidth);
}

// 色调改变的槽函数
void SVColorArea::slotHueChanged(int h)
{
	m_iHue = h;
	updateSVPixmap();
    emit sigSvChanged(m_iHue, m_iSaturation, m_iBrightness);
	update();
}

SVColorArea类和下面的HColorArea类就相对复杂一点了,细节也更多一些,使用的是QLinearGeadient渐变来画一个 pixmap

六、色调区域 - HColorArea

#include "HColorArea.h"

HColorArea::HColorArea(QWidget *parent)
	: QWidget(parent)
	, m_hue(0.0)
	, m_iHue(0)
	, m_iColorHeight(256)
    , m_iColorWidth(25)
{
    this->setFixedSize(34, 270);

    // 创建色调pixmap
	createHuePixmap();
}

void HColorArea::setHue(int h)
{
	m_hue = (double)h / 360;
	m_iHue = h;
	update();
}

void HColorArea::paintEvent(QPaintEvent *)
{
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing);
	painter.drawPixmap(0, 0, m_huePixmap);

	int iHeight = m_iColorHeight - m_hue * m_iColorHeight;
	QPolygonF triangle;
	triangle.append(QPointF(m_iColorWidth, iHeight + topMargin));
	triangle.append(QPointF(width(), iHeight));
	triangle.append(QPointF(width(), iHeight + 2 * topMargin - 1));
	painter.setPen(Qt::NoPen);
	painter.setBrush(Qt::white);
	painter.drawPolygon(triangle);
}

void HColorArea::mousePressEvent(QMouseEvent *ev)
{
	double tempValue = 1 - (double)(ev->pos().y() - topMargin) / m_iColorHeight;
	m_hue = qBound(0.0, tempValue, 1.0);
	update();
	m_iHue = m_hue * 360;
    emit sigHueChanged(m_iHue);
}

void HColorArea::mouseMoveEvent(QMouseEvent *ev)
{
	double tempValue = 1 - (double)(ev->pos().y() - topMargin) / m_iColorHeight;
	m_hue = qBound(0.0, tempValue, 1.0);
	update();
	m_iHue = m_hue * 360;
    emit sigHueChanged(m_iHue);
}

// 创建色调pixmap
void HColorArea::createHuePixmap()
{
	m_huePixmap = QPixmap(34, 270);
	m_huePixmap.fill(Qt::transparent);
	QPainter painter(&m_huePixmap);
	painter.setRenderHint(QPainter::Antialiasing);
	QLinearGradient hueGradient(0, m_iColorHeight, 0, 0);
    for (double i = 0; i < 1.0; i += 1.0 / 16)
	{
		hueGradient.setColorAt(i, QColor::fromHsvF(i, 1, 1, 1));
	}
	hueGradient.setColorAt(1, QColor::fromHsvF(0, 1, 1, 1));
	painter.setPen(Qt::NoPen);
	painter.setBrush(QBrush(hueGradient));
	painter.drawRect(0, topMargin, m_iColorWidth, m_iColorHeight);
}

这里使用的是QLinearGeadient渐变来画一个 pixmap,由下往上,饱和度百分值由 0 增加到 1.0。

七、颜色预览区域 - PreviewColorArea

#include "PreviewColorArea.h"

PreviewColorArea::PreviewColorArea(QWidget *parent)
	: QWidget(parent)
	, m_curColor(Qt::black)
	, m_newColor(Qt::black)
{
    // 初始化界面
    this->setFixedSize(166, 88);
}

// 设置当前颜色
void PreviewColorArea::setCurColor(const QColor &c)
{
	m_curColor = c;
	repaint();
}

// 设置新的颜色
void PreviewColorArea::setNewColor(const QColor &c)
{
	m_newColor = c;
	update();
}

void PreviewColorArea::paintEvent(QPaintEvent *)
{
	QStylePainter painter(this);
	paint(painter, geometry());
}

void PreviewColorArea::resizeEvent(QResizeEvent *)
{
	update();
}

void PreviewColorArea::paint(QPainter &painter, QRect rect) const
{
	int iMiddleWidth = rect.width() / 2;
	int iHeight = rect.height();
	painter.fillRect(0, 0, iMiddleWidth, iHeight, m_curColor);
	painter.fillRect(iMiddleWidth, 0, iMiddleWidth, iHeight, m_newColor);
	painter.setPen(QPen(Qt::black, 1));
	painter.drawRect(0, 0, width() - 1, height() - 1);
}

void PreviewColorArea::slotSvChanged(int h, int s, int v)
{
	m_newColor.setHsv(h, s, v);
	update();
    emit sigSvChanged(h, s, v);
}

用来预览当前颜色和新选择的颜色,左半边区域绘制当前颜色,右半边区域绘制新的颜色。当前颜色是指点击了确定按钮上次选择的颜色,新的颜色是指点击基本颜色控件后待确定选择的颜色。

八、颜色选择界面 - ColorSelWidget

#include "ColorSelWidget.h"

ColorSelWidget::ColorSelWidget(QWidget *parent) : QWidget(parent)
{
    // 初始化界面
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    this->setFixedSize(730, 420);
    this->setFocusPolicy(Qt::ClickFocus);
    this->setObjectName("ColorSelWidget");
    this->setStyleSheet("QWidget#ColorSelWidget{background: rgb(23,25,29);}");

    // 标题栏窗口部件
    m_pLabTitle = new QLabel;
    m_pBtnClose = new QPushButton;
    m_pLabSplitLine = new QLabel;
    m_pLabTitle->setText("编辑颜色");
    m_pLabTitle->setObjectName("LabTitle");
    m_pBtnClose->setObjectName("m_pCloseBtn");
    m_pLabSplitLine->setObjectName("LabSplitLine");
    m_pBtnClose->setFixedSize(30, 30);
    m_pLabSplitLine->setFixedSize(width(), 2);

    // 初始化基本颜色界面
    m_pBasicColorArea = new BasicColorArea;
    // 自定义颜色区域
    m_pCustomColorArea = new CustomColorArea;

    // 初始化饱和度(S)与亮度(V)区域
    m_pSVColorArea = new SVColorArea;
    // 初始化色调区域
    m_pHColorArea = new HColorArea;

    // 初始化预览颜色界面
    m_pPreviewColorArea = new PreviewColorArea;
    m_pLabCurColor = new QLabel;
    m_pLabNewColor = new QLabel;
    m_pBtnOk = new QPushButton;
    m_pBtnCancle = new QPushButton;
    m_pLabCurColor->setText("当前\n颜色");
    m_pLabNewColor->setText("新的\n颜色");
    m_pBtnOk->setText("确定");
    m_pBtnCancle->setText("取消");
    m_pLabCurColor->setFixedSize(30, 40);
    m_pLabNewColor->setFixedSize(30, 40);
    m_pBtnOk->setFixedSize(62, 26);
    m_pBtnCancle->setFixedSize(62, 26);

    // 初始化GroupBox
    m_pGroupBoxBasic = new QGroupBox;
    m_pGroupBoxCustom = new QGroupBox;
    m_pGroupBoxBasic->setTitle("基本颜色");
    m_pGroupBoxCustom->setTitle("自定义颜色");

    // 色调、饱和度、亮度 - 标签、计数器控件
    m_pLabH = new QLabel;
    m_pSpinBoxH = new QSpinBox;
    m_pLabS = new QLabel;
    m_pSpinBoxS = new QSpinBox;
    m_pLabV = new QLabel;
    m_pSpinBoxV = new QSpinBox;
    m_pLabR = new QLabel;
    m_pSpinBoxR = new QSpinBox;
    m_pLabG = new QLabel;
    m_pSpinBoxG = new QSpinBox;
    m_pLabB = new QLabel;
    m_pSpinBoxB = new QSpinBox;
    m_pLabH->setText("色调(H):");
    m_pLabS->setText("饱和度(S):");
    m_pLabV->setText("亮度(V):");
    m_pLabR->setText("红(R):");
    m_pLabG->setText("绿(G):");
    m_pLabB->setText("蓝(B):");
    m_pLabH->setFixedSize(66, 26);
    m_pLabS->setFixedSize(66, 26);
    m_pLabV->setFixedSize(66, 26);
    m_pLabR->setFixedSize(50, 26);
    m_pLabG->setFixedSize(50, 26);
    m_pLabB->setFixedSize(50, 26);

    m_pLabColor = new QLabel; // 颜色文本标签
    m_pEditColor = new QLineEdit; // 颜色编辑框
    m_pBtnCustom = new QPushButton;
    m_pLabColor->setText("#");
    m_pEditColor->setText("000000");
    m_pBtnCustom->setText("添加到自定义颜色");
    m_pBtnCustom->setFixedSize(128, 26);
    m_pEditColor->setFixedSize(72, 26);

    // 正则表达式应用在颜色编辑栏
    QRegExp rx("(\\d?[a-f]?){0,6}");
    m_pEditColor->setValidator(new QRegExpValidator(rx, this));
    m_pEditColor->setText("000000");

    // 标题栏布局
    QHBoxLayout *pLayoutTitle = new QHBoxLayout;
    pLayoutTitle->addSpacing(6);
    pLayoutTitle->addWidget(m_pLabTitle);
    pLayoutTitle->addStretch();
    pLayoutTitle->addWidget(m_pBtnClose, 0, Qt::AlignTop);
    pLayoutTitle->addSpacing(4);
    pLayoutTitle->setMargin(0);

    // 基本颜色布局
    QVBoxLayout *pLayoutBasic = new QVBoxLayout(m_pGroupBoxBasic);
    pLayoutBasic->addWidget(m_pBasicColorArea);
    // 自定义颜色布局
    QVBoxLayout *pLayoutCustom = new QVBoxLayout(m_pGroupBoxCustom);
    pLayoutCustom->addWidget(m_pCustomColorArea);

    // 下方布局
    QHBoxLayout *pLayoutDown = new QHBoxLayout;
    pLayoutDown->addStretch();
    pLayoutDown->addWidget(m_pLabColor);
    pLayoutDown->addSpacing(2);
    pLayoutDown->addWidget(m_pEditColor);
    pLayoutDown->addStretch();
    pLayoutDown->addWidget(m_pBtnCustom);
    pLayoutDown->addSpacing(0);
    pLayoutDown->setSpacing(0);
    pLayoutDown->setMargin(0);

    // 左侧布局
    QVBoxLayout *pLayoutLeft = new QVBoxLayout;
    pLayoutLeft->addWidget(m_pGroupBoxBasic);
    pLayoutLeft->addSpacing(12);
    pLayoutLeft->addWidget(m_pGroupBoxCustom);
    pLayoutLeft->addSpacing(12);
    pLayoutLeft->addLayout(pLayoutDown);
    pLayoutLeft->setSpacing(0);
    pLayoutLeft->addStretch();
    pLayoutLeft->setMargin(0);

    // 网格布局
    QGridLayout *m_pGridLayout = new QGridLayout;
    m_pGridLayout->addWidget(m_pLabH, 0, 0, Qt::AlignRight);
    m_pGridLayout->addWidget(m_pSpinBoxH, 0, 1);
    m_pGridLayout->addWidget(m_pLabS, 1, 0, Qt::AlignRight);
    m_pGridLayout->addWidget(m_pSpinBoxS, 1, 1);
    m_pGridLayout->addWidget(m_pLabV, 2, 0, Qt::AlignRight);
    m_pGridLayout->addWidget(m_pSpinBoxV, 2, 1);
    m_pGridLayout->addWidget(m_pLabR, 3, 0, Qt::AlignRight);
    m_pGridLayout->addWidget(m_pSpinBoxR, 3, 1);
    m_pGridLayout->addWidget(m_pLabG, 4, 0, Qt::AlignRight);
    m_pGridLayout->addWidget(m_pSpinBoxG,4, 1);
    m_pGridLayout->addWidget(m_pLabB, 5, 0, Qt::AlignRight);
    m_pGridLayout->addWidget(m_pSpinBoxB, 5, 1);

    // 色调布局
    QHBoxLayout *pLayoutHue = new QHBoxLayout;
    pLayoutHue->addStretch();
    pLayoutHue->addWidget(m_pSVColorArea);
    pLayoutHue->addSpacing(10);
    pLayoutHue->addWidget(m_pHColorArea);
    pLayoutHue->addSpacing(10);
    pLayoutHue->addLayout(m_pGridLayout);
    pLayoutHue->addStretch();
    pLayoutHue->setSpacing(0);
    pLayoutHue->setMargin(0);

    // 颜色预览布局
    QHBoxLayout *pLayoutPreview = new QHBoxLayout;
    pLayoutPreview->addSpacing(12);
    pLayoutPreview->addWidget(m_pLabCurColor);
    pLayoutPreview->addSpacing(8);
    pLayoutPreview->addWidget(m_pPreviewColorArea);
    pLayoutPreview->addSpacing(8);
    pLayoutPreview->addWidget(m_pLabNewColor);
    pLayoutPreview->addStretch();
    pLayoutPreview->addWidget(m_pBtnOk);
    pLayoutPreview->addSpacing(10);
    pLayoutPreview->addWidget(m_pBtnCancle);
    pLayoutPreview->addSpacing(4);
    pLayoutPreview->setSpacing(0);
    pLayoutPreview->setMargin(0);

    // 中间布局
    QVBoxLayout *pLayoutCenter = new QVBoxLayout;
    pLayoutCenter->addStretch();
    pLayoutCenter->addLayout(pLayoutHue);
    pLayoutCenter->addLayout(pLayoutPreview);
    pLayoutCenter->addStretch();
    pLayoutCenter->setMargin(0);

    // 布局
    QHBoxLayout *pLayoutMainR = new QHBoxLayout;
    pLayoutMainR->addSpacing(0);
    pLayoutMainR->addLayout(pLayoutLeft);
    pLayoutMainR->addSpacing(12);
    pLayoutMainR->addLayout(pLayoutCenter);
    pLayoutMainR->addSpacing(0);
    pLayoutCenter->setSpacing(0);
    pLayoutMainR->setContentsMargins(12, 0, 12, 12);

    // 主布局
    QVBoxLayout *pLayoutMain = new QVBoxLayout(this);
    pLayoutMain->addSpacing(0);
    pLayoutMain->addLayout(pLayoutTitle);
    pLayoutMain->addWidget(m_pLabSplitLine);
    pLayoutMain->addLayout(pLayoutMain2);
    pLayoutMain->addStretch();
    pLayoutMain->setMargin(0);

    // 各个界面的信号槽连接
    connect(m_pBasicColorArea, &BasicColorArea::sigColorItemSel, this, &ColorSelWidget::slotColorItemSel);
    connect(m_pCustomColorArea, &CustomColorArea::sigColorItemSel, this, &ColorSelWidget::slotColorItemSel);
    connect(m_pSVColorArea, &SVColorArea::sigSvChanged, m_pPreviewColorArea, &PreviewColorArea::slotSvChanged);
    connect(m_pPreviewColorArea, &PreviewColorArea::sigSvChanged, this, &ColorSelWidget::slotUpdateEditData);
    connect(m_pHColorArea, &HColorArea::sigHueChanged, m_pSVColorArea, &SVColorArea::slotHueChanged);

    // 颜色编辑框改变
    connect(m_pEditColor, &QLineEdit::textEdited, this, &ColorSelWidget::slotEditChanged);
    connect(m_pEditColor, &QLineEdit::editingFinished, this, &ColorSelWidget::slotEditFinished);

    // 各按钮
    connect(m_pBtnCustom, &QPushButton::clicked, this, &ColorSelWidget::slotAddCustomColor);
    connect(m_pBtnOk, &QPushButton::clicked, this, &ColorSelWidget::slotOkBtnClicked);
    connect(m_pBtnCancle, &QPushButton::clicked, this, &ColorSelWidget::slotCancelBtnClicked);
    connect(m_pBtnClose, &QPushButton::clicked, this, &ColorSelWidget::slotCancelBtnClicked);

    // 计数器控件
    connect(m_pSpinBoxH, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedH(int)));
    connect(m_pSpinBoxS, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedS(int)));
    connect(m_pSpinBoxV, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedV(int)));
    connect(m_pSpinBoxR, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedR(int)));
    connect(m_pSpinBoxG, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedG(int)));
    connect(m_pSpinBoxB, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedB(int)));
}

// ......

颜色选择界面,将上述区域类对象子界面全放置在该界面上。右侧的色调、饱和度等编辑框,也在该界面上直接创建,没有再新建子界面类实现。由于代码比较长,这里只显示构造函数代码,其它的下载源码查看。
重点在各个信号槽的连接:

// 各个界面的信号槽连接
connect(m_pBasicColorArea, &BasicColorArea::sigColorItemSel, this, &ColorSelWidget::slotColorItemSel);
connect(m_pCustomColorArea, &CustomColorArea::sigColorItemSel, this, &ColorSelWidget::slotColorItemSel);
connect(m_pSVColorArea, &SVColorArea::sigSvChanged, m_pPreviewColorArea, &PreviewColorArea::slotSvChanged);
connect(m_pPreviewColorArea, &PreviewColorArea::sigSvChanged, this, &ColorSelWidget::slotUpdateEditData);
connect(m_pHColorArea, &HColorArea::sigHueChanged, m_pSVColorArea, &SVColorArea::slotHueChanged);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/542491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android SELinux安全机制与权限管理那些事

文章目录 前言权限管理系统应用特权应用历史漏洞广播的保护机制CVE-2020-0391 SELinux 前言 在 Android 漏洞挖掘和安全研究过程中&#xff0c;不可避免地会涉及到跟 Android SELinux 安全机制打交道&#xff0c;比如当你手握一个 System 应用的路径穿越的漏洞的时候想去覆写其…

DS:基于鸢尾花数据集利用多种数据降维技术(PCA、SVD、MDS、LDA、T-SNE)实现三维可视化

DS&#xff1a;基于鸢尾花数据集利用多种数据降维技术(PCA、SVD、MDS、LDA、T-SNE)实现三维可视化 目录 基于鸢尾花数据集利用多种数据降维技术(PCA、SVD、MDS、LDA、T-SNE)实现三维可视化 # 1、加载示例数据集&#xff08;鸢尾花数据集&#xff09; # 2、数据预处理 # T1、…

媒体专访是品牌初创阶段宣传的重要手段

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 很早以前&#xff0c;有位前辈跟我讲&#xff0c;人的成功分两种&#xff0c;一种是借助平台成功&#xff0c;一种是自己创业成功&#xff0c; 前者成功的概率很大&#xff0c;只需要选好…

【5.18】二、黑盒测试方法—因果图与决策表法

目录 2.3 因果图与决策表法 2.3.1 因果图设计法 2.3.2 决策表 2.3.3 实例&#xff1a;三角形决策表 2.3.4 实例&#xff1a;工资发放决策表 2.3 因果图与决策表法 等价类划分法与边界值分析法主要侧重于输入条件&#xff0c;却没有考虑这些输入之间的关系&#xff0c;如…

单链表和双向链表如何执行删除操作

在实际的软件开发中&#xff0c;从链表中删除一个数据无外乎这两种情况&#xff1a; 删除结点中“值等于某个给定值”的结点&#xff1b;删除给定指针指向的结点。 1.从头结点开始一个一个依次遍历对比&#xff0c;直到找到值等于给定值的结点&#xff0c;然后再通过我前面讲…

LeetCode高频算法刷题记录4

文章目录 1. 二叉树的最近公共祖先【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 全排列【中等】2.1 题目描述2.2 解题思路2.3 代码实现 3. 相交链表【简单】3.1 题目描述3.2 解题思路3.3 代码实现 4. 合并 K 个升序链表【困难】4.1 题目描述4.2 解题思路4.3 代码实现 5. 环…

chatgpt赋能Python-python3_4怎么下载

Python3.4的下载和安装 Python是一种流行的编程语言&#xff0c;它被广泛用于算法学习、数据分析和网站开发等领域。Python3.4是Python编程语言的一个版本&#xff0c;它在性能和功能方面都得到了改进。如果你希望学习Python3.4或者使用它开发项目&#xff0c;那么你需要下载并…

Jetpack Compose中的附带效应简介及使用

前言 附带效应是指LaunchedEffect、DisposableEffect、rememberCoroutineScope、rememberUpdatedState、produceState 、derivedStateOf的使用。附带效应这4个字在google官方文档上的表达与解释挺让人难以理解的。其实个人认为准确的描述应该是外部产生的数据向Compose状态作用…

chatgpt赋能Python-python3_8_1怎么用

Python3.8.1使用指南&#xff1a;让您的编程更加高效 Python是一种流行的高级编程语言&#xff0c;它以简洁明了的语法和丰富的库而著称。如果您是一名新手或有经验的程序员&#xff0c;Python都是一个很好的选择。在Python3.8.1中&#xff0c;新的功能和改进将进一步提高Pyth…

chatgpt赋能Python-python2的n次方程序

Python2的N次方程序&#xff1a;一个实用的编程工具 Python2是广泛使用的编程语言之一&#xff0c;它是一种强大且灵活的开源语言&#xff0c;被广泛应用于科学计算、数据分析、Web开发等领域。在Python2中&#xff0c;N次方程序是一种非常基础的程序&#xff0c;但是它在实际…

二叉树的基本认识(一)

要了解二叉树&#xff0c;就必然要知道什么是树&#xff0c;树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的…

C++类模板的具体化

目录 分类 代码 分析 一、类模板 一&#xff09;代码 二&#xff09;注意事项 三&#xff09;运行结果 二、完全具体化的模板类 一&#xff09;代码 二&#xff09;注意事项 三&#xff09;执行结果 三、部分具体化的模板类 一&#xff09;代码 二&#xff09;注…

【研发工具】Yapi接口管理平台内网Centos8下搭建

1 环境依赖安装 环境要求 nodejs&#xff08;7.6) &#xff08;本文安装12.18.3&#xff09; mongodb&#xff08;2.6&#xff09;&#xff08;本文安装5.0.17&#xff09; 1.1 安装Nodejs 1.1.1 下载安装包 下载地址&#xff1a;https://nodejs.org/zh-cn/download/这里下载…

代码随想录训练营Day42|背包问题

目录 学习目标 学习内容 416. 分割等和子集 学习目标 01背包问题&#xff0c;你该了解这些&#xff01; 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 416. 分割等和子集 学习内容 problems/背包理论基础01背包-1.md programmercarl/leetcode-master&#…

Java【网络编程2】详解ServerSocket和Socket类, 逐行代码解析如何服务器客户端通信(附代码)

文章目录 前言一、认识 Socket(套接字), TCP 协议和 UDP 协议1, 什么是 Socket(套接字)2, 浅谈 TCP 协议和 UDP 协议的区别和特点 二、基于 TCP 协议的 Socket API1, ServerSocket 类2, Socket 类 三、逐行代码解析网络编程1, 逐行解析客户端1.1, 核心成员方法 start() 2, 逐行…

【黑马笔记】Servlet简易教程

1. Servlet demo 0. 新建web app项目 记得去 web.xml 中删除多余的配置&#xff0c;以及新建对应的文件夹 1. 导入 Servlet依赖坐标 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version&…

四块ACM区域赛金牌,我队友

是的&#xff0c;毕业12年以后&#xff0c;他来找我。     痛失网名了属于是&#xff0c;但是这不重要&#xff0c;​怎么说呢&#xff1f;有点激动&#xff0c;我得把这件事情记录下来&#xff0c;这是一位重量级的人物&#xff0c;也是大家眼中别人家的孩子。     他…

Python网络爬虫:Scrapy和Beautiful Soup的使用和数据处理技巧

章节一&#xff1a;引言 在当今互联网时代&#xff0c;数据的价值越来越被重视&#xff0c;而网络爬虫作为一种强大的工具&#xff0c;可以帮助我们从互联网中提取有用的数据。Python作为一门广泛应用于数据科学和网络开发的编程语言&#xff0c;有着丰富的库和框架来支持网络…

SD卡数据恢复软件哪个最好 SD卡数据恢复多少钱

SD卡是一种常见的数字存储卡&#xff0c;由于其体积小、存储能力强&#xff0c;至今仍然被应用在手机&#xff0c;行车记录仪&#xff0c;微型摄像机中。但SD卡在使用过程中可能会出现一些故障或者数据丢失的情况。那么今天小编就给大家介绍一下SD卡数据恢复软件哪个最好&#…

泊松分布和指数分布的关系

泊松分布和指数分布的关系 泊松分布用于描述单位时间&#xff08;或面积内&#xff09;随机事件发生的次数&#xff08;离散型随机变量&#xff09;&#xff0c; λ \lambda λ表示随机事件在单位时间&#xff08;或面积内&#xff09;发生的平均次数 The Poisson distributio…