屏幕颜色拾取器

        遇到一个好看的背景颜色,想知道它的RGB值,这时就需要屏幕颜色拾取器了。如下,用鼠标左键点中+字,拖曳到要拾取的颜色位置,松开左键就得该位置的RGB值了。
在这里插入图片描述
        该工程的Qt源码和exe工具链接
        使用Qt5.4.1编写屏幕拾取器的代码如下:
//1) 头文件 myColor.h

#pragma once

#include <QtWidgets/QWidget>
#include "ui_myColor.h"


class QGridLayout;
class QVBoxLayout;
class QLabel;
class QLineEdit;

#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif


class myColor : public QWidget
{
    
    
	Q_OBJECT

public:
	static myColor *Instance();
	myColor(QWidget *parent = Q_NULLPTR);

protected:
	void mousePressEvent(QMouseEvent *);
	void mouseReleaseEvent(QMouseEvent *);

private:
	static myColor *instance;
	QClipboard *cp;
	bool pressed;
	QTimer *timer;

	QGridLayout *gridLayout;
	QVBoxLayout *verticalLayout;
	QLabel *labColor;
	QLabel *label;
	QLabel *labWeb;
	QLineEdit *txtWeb;
	QLabel *labRgb;
	QLineEdit *txtRgb;
	QLabel *labPoint;
	QLineEdit *txtPoint;

	private Q_SLOTS:
	void showColorValue();

private:
	Ui::myColorClass ui;
};

//2) 源文件 myColor.cpp

#pragma execution_character_set("utf-8")

#include "myColor.h"
#include <QBasicMutex>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QApplication>
#include <QMouseEvent>
#include <QTimer>
#include <QEvent>
#include <QDebug>
#include <QScreen>
#include <qdesktopwidget.h>

myColor *myColor::instance = 0;
myColor *myColor::Instance()
{
    
    
	if (!instance)
	{
    
    
		static QMutex mutex;
		QMutexLocker locker(&mutex);
		if (!instance)
		{
    
    
			instance = new myColor;
		}
	}
	
	return instance;
}


myColor::myColor(QWidget *parent)
	: QWidget(parent)
{
    
    
	gridLayout = new QGridLayout(this);
	gridLayout->setSpacing(6);
	gridLayout->setContentsMargins(11, 11, 11, 11);

	verticalLayout = new QVBoxLayout();
	verticalLayout->setSpacing(0);

	labColor = new QLabel(this);
	labColor->setText("+");
	labColor->setStyleSheet("background-color: rgb(255, 107, 107);color: rgb(250, 250, 250);");
	labColor->setAlignment(Qt::AlignCenter);
	QFont font;
	font.setPixelSize(35);
	font.setBold(true);
	labColor->setFont(font);

	QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
	sizePolicy.setHorizontalStretch(0);
	sizePolicy.setVerticalStretch(0);
	sizePolicy.setHeightForWidth(labColor->sizePolicy().hasHeightForWidth());
	labColor->setSizePolicy(sizePolicy);
	labColor->setMinimumSize(QSize(80, 70));
	labColor->setMaximumSize(QSize(80, 70));
	labColor->setCursor(QCursor(Qt::CrossCursor));
	labColor->setFrameShape(QFrame::StyledPanel);
	labColor->setFrameShadow(QFrame::Sunken);

	verticalLayout->addWidget(labColor);

	label = new QLabel(this);
	label->setMinimumSize(QSize(0, 18));
	label->setStyleSheet("background-color: rgb(0, 0, 0);color: rgb(200, 200, 200);");
	label->setAlignment(Qt::AlignCenter);

	verticalLayout->addWidget(label);
	gridLayout->addLayout(verticalLayout, 0, 0, 3, 1);

	labWeb = new QLabel(this);
	gridLayout->addWidget(labWeb, 0, 1, 1, 1);

	txtWeb = new QLineEdit(this);
	gridLayout->addWidget(txtWeb, 0, 2, 1, 1);

	labRgb = new QLabel(this);
	gridLayout->addWidget(labRgb, 1, 1, 1, 1);

	txtRgb = new QLineEdit(this);
	gridLayout->addWidget(txtRgb, 1, 2, 1, 1);

	labPoint = new QLabel(this);
	gridLayout->addWidget(labPoint, 2, 1, 1, 1);

	txtPoint = new QLineEdit(this);
	gridLayout->addWidget(txtPoint, 2, 2, 1, 1);

	label->setText("当前颜色显示");
	labWeb->setText("web值:");
	labRgb->setText("rgb值:");
	labPoint->setText("坐标值:");

	this->setLayout(gridLayout);
	this->setWindowTitle("屏幕拾色器");
	this->setFixedSize(270, 108);

	cp = QApplication::clipboard();
	pressed = false;

	timer = new QTimer(this);
	timer->setInterval(100);
	connect(timer, SIGNAL(timeout()), this, SLOT(showColorValue()));
	timer->start();

	ui.setupUi(this);
}

void myColor::mousePressEvent(QMouseEvent *e)
{
    
    
	if (labColor->rect().contains(e->pos()))
	{
    
    
		pressed = true;
	}
}

void myColor::mouseReleaseEvent(QMouseEvent *e)
{
    
    
	pressed = false;
}

void myColor::showColorValue()
{
    
    
	if (!pressed)
	{
    
    
		return;
	}

	int x = QCursor::pos().x();
	int y = QCursor::pos().y();

	txtPoint->setText(tr("x:%1  y:%2").arg(x).arg(y));
	QString strDecimalValue, strHex, strTextColor;
	int red, green, blue;

#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
	QPixmap pixmap = QPixmap::grabWindow(QApplication::desktop()->winId(), x, y, 2, 2);
#else
	QScreen *screen = QApplication::primaryScreen();
	QPixmap pixmap = screen->grabWindow(QApplication::desktop()->winId(), x, y, 2, 2);
#endif

	if (!pixmap.isNull()) {
    
    
		QImage image = pixmap.toImage();

		if (!image.isNull()) {
    
    
			if (image.valid(0, 0)) {
    
    
				QColor color = image.pixel(0, 0);
				red = color.red();
				green = color.green();
				blue = color.blue();
				QString strRed = tr("%1").arg(red & 0xFF, 2, 16, QChar('0'));
				QString strGreen = tr("%1").arg(green & 0xFF, 2, 16, QChar('0'));
				QString strBlue = tr("%1").arg(blue & 0xFF, 2, 16, QChar('0'));

				strDecimalValue = tr("%1, %2, %3").arg(red).arg(green).arg(blue);
				strHex = tr("#%1%2%3").arg(strRed.toUpper()).arg(strGreen.toUpper()).arg(strBlue.toUpper());
			}
		}
	}

	if (red > 200 && green > 200 && blue > 200) {
    
    
		strTextColor = "10, 10, 10";
	}
	else {
    
    
		strTextColor = "255, 255, 255";
	}

	QString str = tr("background-color: rgb(%1);color: rgb(%2)").arg(strDecimalValue).arg(strTextColor);
	labColor->setStyleSheet(str);
	txtRgb->setText(strDecimalValue);
	txtWeb->setText(strHex);

}

猜你喜欢

转载自blog.csdn.net/sanqima/article/details/103923149