开发平台
简介
微信上有一些好玩的游戏, 找不同一种比较轻松有趣的游戏,也曾经在街机上被坑过N币, 玩了几次后,发现还是太难了,于是开始截屏放大,慢慢找,再然后就发展到截图发送到QQ的我的电脑里,用程序查找标记
看效果:
#pragma once
#include
#include
#include
#include "ui_widget.h"
namespace Ui {
class Widget;
}
class MWidget : public QWidget
{
Q_OBJECT
public:
explicit MWidget(QWidget *parent = nullptr);
~MWidget();
private slots:
void on_pushButton_start_clicked();
bool loadImage();
void showImages();
void findDifferent();
void setFrameColor(QColor color);
void on_pushButton_color_clicked();
void on_spinBox_valueChanged(int arg1);
void on_horizontalSlider_valueChanged(int value);
void on_spinBox_x1_valueChanged(int arg1);
void on_spinBox_y1_valueChanged(int arg1);
void on_spinBox_x2_valueChanged(int arg1);
void on_spinBox_y2_valueChanged(int arg1);
void on_spinBox_w_valueChanged(int arg1);
void on_spinBox_h_valueChanged(int arg1);
void on_comboBox_currentIndexChanged(int index);
public:
Ui::Widget *ui;
private:
QImage srcImg , src, dst, result;
int label_src1_height;
int label_src2_height;
int label_result_height;
QColor frameColor = QColor("#55ffff");
QFileSystemWatcher fwatcher;
QString workPath;
// QWidget interface
protected:
void resizeEvent(QResizeEvent *event);
};
#include "widget.h"
#include "qout.h"
#include "ui_widget.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
MWidget::MWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->label_src1->setAlignment(Qt::AlignCenter);
ui->label_src2->setAlignment(Qt::AlignCenter);
ui->label_result->setAlignment(Qt::AlignCenter);
ui->pushButton_start->setFocusPolicy(Qt::StrongFocus);
ui->pushButton_start->setFocus(Qt::TabFocusReason);
ui->pushButton_start->setAutoFillBackground(true);
ui->pushButton_start->setAutoDefault(true);
// qout << focusNextChild() << focusWidget();
// qout << focusNextChild() << focusWidget();
// qout << focusNextChild() << focusWidget();
ui->frame->setAutoFillBackground(true);
ui->frame->setMaximumWidth(200);
setFrameColor(frameColor);
workPath = QDir::fromNativeSeparators(ui->lineEdit->text());
fwatcher.addPath(workPath);
connect(&fwatcher, &QFileSystemWatcher::fileChanged,this,[](const QString &path){
qout << path << "fileChanged";
});
connect(&fwatcher, &QFileSystemWatcher::directoryChanged,this,[this](const QString &path){
qout << path << "directoryChanged";
on_pushButton_start_clicked();
});
QFile file("D:/Project/qtdemos/32_opencv/FindDiff_Qt/找不同.json"); // 数据文件路径
if(file.open(QFile::ReadOnly)) {
auto byte = file.readAll();
QJsonParseError JsonParseError ;
QJsonDocument doc = QJsonDocument::fromJson(byte, &JsonParseError);
if(JsonParseError.error)
qout << JsonParseError.errorString();
QSignalBlocker b(ui->comboBox);
ui->comboBox->clear();
QJsonArray docJsonArray = doc.array();
for (int i = 0; i < docJsonArray.size(); ++i) {
QJsonObject obj = docJsonArray.at(i).toObject();
QString title = obj["title"].toString();
int x1 = obj["x1"].toInt();
int y1 = obj["y1"].toInt();
int x2 = obj["x2"].toInt();
int y2 = obj["y2"].toInt();
int w = obj["w"].toInt();
int h = obj["h"].toInt();
QString itemTxt("%1:\tP1(%2,%3)\tP2(%4,%5)\t%6 x %7");
itemTxt = itemTxt.arg(title).arg(x1).arg(y1).arg(x2).arg(y2).arg(w).arg(h);
ui->comboBox->addItem(itemTxt);
QVariantList list;
list << x1 << y1 << x2 << y2 << w << h;
ui->comboBox->setItemData(i,list);
}
}
on_comboBox_currentIndexChanged(0);
}
MWidget::~MWidget()
{
delete ui;
}
void MWidget::on_pushButton_start_clicked()
{
auto ok = loadImage();
if( ok )
findDifferent();
showImages();
}
bool MWidget::loadImage()
{
workPath = QDir::fromNativeSeparators(ui->lineEdit->text());
qout << workPath;
QDir dir(workPath);
if(!dir.exists())
return false;
QStringList nameFilters;
nameFilters << "*.jpg";
QStringList fileNames = dir.entryList(nameFilters,QDir::Files,QDir::Name);
qout << fileNames;
if(fileNames.isEmpty())
return false;
QSignalBlocker block(fwatcher);
for (int i = 0; i < fileNames.size()-1; ++i) {
dir.remove(fileNames.at(i));
}
QString imageFile( dir.absoluteFilePath(fileNames.last()) );
srcImg.load(imageFile);
src = srcImg.copy(ui->spinBox_x1->value(),ui->spinBox_y1->value(),
ui->spinBox_w ->value(),ui->spinBox_h ->value());
dst = srcImg.copy(ui->spinBox_x2->value(),ui->spinBox_y2->value(),
ui->spinBox_w ->value(),ui->spinBox_h ->value());
// 找不同
// src = srcImg.copy(16,294,1096,729);
// dst = srcImg.copy(16,1055,1096,729);
// 小花找不同
// src = srcImg.copy(119,452,465,1057);
// dst = srcImg.copy(588,452,465,1057);
result = dst;
return true;
}
void MWidget::showImages()
{
qout << "showImages";
if(src.isNull())
return ;
ui->label_src1 ->setPixmap(QPixmap::fromImage(src) .scaledToHeight(ui->label_src1 ->height()-ui->label_src1->frameWidth() * 2));
ui->label_src2 ->setPixmap(QPixmap::fromImage(dst) .scaledToHeight(ui->label_src2 ->height()-ui->label_src1->frameWidth() * 2));
ui->label_result->setPixmap(QPixmap::fromImage(result) .scaledToHeight(ui->label_result->height()-ui->label_src1->frameWidth() * 2));
}
void MWidget::findDifferent()
{
qout << "findDifferent";
if(src.isNull())
return ;
QPainter painter;
result = src;
result = result.convertToFormat(QImage::Format_Grayscale8);
result = result.convertToFormat(QImage::Format_RGB32);
painter.begin(&result);
painter.setPen(frameColor);
for (int i = 0; i < src.width(); ++i) {
for (int j = 0; j < src.height(); ++j) {
QRgb srcPix = src.pixel(i,j);
QRgb dstPix = dst.pixel(i,j);
if ( ( qAbs( (qRed (srcPix) -qRed(dstPix) ) ) > ui->spinBox->value() // 红色
||qAbs( (qGreen(srcPix)-qGreen(dstPix) ) ) > ui->spinBox->value() // 绿色
||qAbs( (qBlue (srcPix)-qBlue (dstPix) ) ) > ui->spinBox->value() ) // 蓝色
)
{
painter.drawPoint(i,j);
}
}
}
painter.end();
}
void MWidget::setFrameColor(QColor color)
{
auto frame = ui->frame;
QPalette p = frame->palette();
p.setBrush( QPalette::Window, color);
frame->setPalette(p);
}
void MWidget::resizeEvent(QResizeEvent */*event*/)
{
if(src.isNull())
return;
showImages();
}
void MWidget::on_pushButton_color_clicked()
{
auto color = QColorDialog::getColor(QColor(85,255,255));
frameColor = color;
setFrameColor(color);
if(src.isNull()) return;
findDifferent();
ui->label_result->setPixmap(QPixmap::fromImage(result) .scaledToHeight(ui->label_result->height()-ui->label_src1->frameWidth() * 2));
}
void MWidget::on_spinBox_valueChanged(int arg1)
{
ui->horizontalSlider->setValue(arg1);
}
void MWidget::on_horizontalSlider_valueChanged(int value)
{
ui->spinBox->setValue(value);
findDifferent();
ui->label_result->setPixmap(QPixmap::fromImage(result) .scaledToHeight(ui->label_result->height()-ui->label_src1->frameWidth() * 2));
}
void MWidget::on_spinBox_x1_valueChanged(int arg1)
{
on_pushButton_start_clicked();
}
void MWidget::on_spinBox_x2_valueChanged(int arg1)
{
on_pushButton_start_clicked();
}
void MWidget::on_spinBox_y1_valueChanged(int arg1)
{
on_pushButton_start_clicked();
}
void MWidget::on_spinBox_y2_valueChanged(int arg1)
{
on_pushButton_start_clicked();
}
void MWidget::on_spinBox_w_valueChanged(int arg1)
{
on_pushButton_start_clicked();
}
void MWidget::on_spinBox_h_valueChanged(int arg1)
{
on_pushButton_start_clicked();
}
void MWidget::on_comboBox_currentIndexChanged(int index)
{
auto vars = ui->comboBox->itemData(index).value<QVariantList>();
qout << "=======" << index << vars;
QSignalBlocker x1( ui->spinBox_x1 );
QSignalBlocker y1( ui->spinBox_y1 );
QSignalBlocker x2( ui->spinBox_x2 );
QSignalBlocker y2( ui->spinBox_y2 );
QSignalBlocker w ( ui->spinBox_w );
QSignalBlocker h ( ui->spinBox_h );
ui->spinBox_x1->setValue(vars.at(0).toInt());
ui->spinBox_y1->setValue(vars.at(1).toInt());
ui->spinBox_x2->setValue(vars.at(2).toInt());
ui->spinBox_y2->setValue(vars.at(3).toInt());
ui->spinBox_w ->setValue(vars.at(4).toInt());
ui->spinBox_h ->setValue(vars.at(5).toInt());
}
<ui version="4.0">
<class>Widgetclass>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0x>
<y>0y>
<width>873width>
<height>672height>
rect>
property>
<property name="minimumSize">
<size>
<width>0width>
<height>300height>
size>
property>
<property name="windowTitle">
<string>Formstring>
property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_src1">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="minimumSize">
<size>
<width>400width>
<height>300height>
size>
property>
<property name="frameShape">
<enum>QFrame::Boxenum>
property>
<property name="text">
<string/>
property>
<property name="buddy">
<cstring>bottomrightcstring>
property>
widget>
item>
<item row="0" column="1">
<widget class="QLabel" name="label_result">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="minimumSize">
<size>
<width>400width>
<height>300height>
size>
property>
<property name="frameShape">
<enum>QFrame::Boxenum>
property>
<property name="text">
<string/>
property>
widget>
item>
<item row="1" column="0">
<widget class="QLabel" name="label_src2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="minimumSize">
<size>
<width>400width>
<height>300height>
size>
property>
<property name="frameShape">
<enum>QFrame::Boxenum>
property>
<property name="text">
<string/>
property>
widget>
item>
<item row="1" column="1">
<widget class="QFrame" name="bottomright">
<property name="minimumSize">
<size>
<width>400width>
<height>300height>
size>
property>
<property name="frameShape">
<enum>QFrame::Boxenum>
property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0" colspan="4">
<widget class="QComboBox" name="comboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<item>
<property name="text">
<string>找不同 p1(16,293) p2(16,1055) 1096 x 729string>
property>
item>
<item>
<property name="text">
<string>小花找不同 p1(119,452) p2(588,452) 465 x 1057string>
property>
item>
widget>
item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="text">
<string>x1string>
property>
widget>
item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBox_x1">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="maximum">
<number>2000number>
property>
<property name="value">
<number>119number>
property>
widget>
item>
<item row="1" column="2">
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="text">
<string>x2string>
property>
widget>
item>
<item row="1" column="3">
<widget class="QSpinBox" name="spinBox_x2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="maximum">
<number>2000number>
property>
<property name="value">
<number>588number>
property>
widget>
item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="text">
<string>y1string>
property>
widget>
item>
<item row="2" column="1">
<widget class="QSpinBox" name="spinBox_y1">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="maximum">
<number>2000number>
property>
<property name="value">
<number>452number>
property>
widget>
item>
<item row="2" column="2">
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="text">
<string>y2string>
property>
widget>
item>
<item row="2" column="3">
<widget class="QSpinBox" name="spinBox_y2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="maximum">
<number>2000number>
property>
<property name="value">
<number>452number>
property>
widget>
item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="text">
<string>wstring>
property>
widget>
item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="text">
<string>hstring>
property>
widget>
item>
<item row="3" column="1" colspan="3">
<widget class="QSpinBox" name="spinBox_w">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="maximum">
<number>2000number>
property>
<property name="value">
<number>465number>
property>
widget>
item>
<item row="4" column="1" colspan="3">
<widget class="QSpinBox" name="spinBox_h">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0horstretch>
<verstretch>0verstretch>
sizepolicy>
property>
<property name="maximum">
<number>2000number>
property>
<property name="value">
<number>1057number>
property>
widget>
item>
layout>
widget>
item>
<item>
<widget class="QFrame" name="frame1">
<property name="frameShape">
<enum>QFrame::Boxenum>
property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLineEdit" name="lineEdit">
<property name="text">
<string>D:\Users\Administrator\Documents\Tencent Files\xxx保密需要xxx\FileRecv\MobileFilestring>
property>
widget>
item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>色差string>
property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenterset>
property>
widget>
item>
<item>
<widget class="QSlider" name="horizontalSlider">
<property name="value">
<number>20number>
property>
<property name="orientation">
<enum>Qt::Horizontalenum>
property>
widget>
item>
<item>
<widget class="QSpinBox" name="spinBox">
<property name="maximum">
<number>255number>
property>
<property name="value">
<number>40number>
property>
widget>
item>
layout>
item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontalenum>
property>
<property name="sizeHint" stdset="0">
<size>
<width>153width>
<height>20height>
size>
property>
spacer>
item>
<item>
<widget class="QFrame" name="frame">
<property name="minimumSize">
<size>
<width>100width>
<height>0height>
size>
property>
widget>
item>
<item>
<widget class="QPushButton" name="pushButton_color">
<property name="text">
<string>颜色string>
property>
widget>
item>
layout>
item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontalenum>
property>
<property name="sizeHint" stdset="0">
<size>
<width>278width>
<height>20height>
size>
property>
spacer>
item>
<item>
<widget class="QPushButton" name="pushButton_start">
<property name="text">
<string>开始string>
property>
widget>
item>
layout>
item>
layout>
widget>
item>
layout>
widget>
item>
layout>
widget>
<tabstops>
<tabstop>lineEdittabstop>
<tabstop>horizontalSlidertabstop>
<tabstop>spinBoxtabstop>
<tabstop>pushButton_colortabstop>
<tabstop>pushButton_starttabstop>
tabstops>
<resources/>
<connections/>
ui>
[
{
"title":"找不同",
"x1":16,
"y1":294,
"x2":16,
"y2":1055,
"w":1096,
"h":729
},
{
"title":"小花找不同-横向",
"x1":53,
"y1":441,
"x2":53,
"y2":1107,
"w":1020,
"h":636
},
{
"title":"小花找不同-竖向",
"x1":119,
"y1":452,
"x2":588,
"y2":452,
"w":465,
"h":1057
}
]