文章目录

  • 前言
  • 演示图
    • 1.ShowWidget.h
    • 2.ShowWidget.cpp
    • 3.MainWindow.h
    • 4.MainWindow.cpp

前言

自己简单实现了下拼图功能.本来开始只是想显示个图片的。


演示图


![请添加图片描述](https://img-blog.csdnimg.cn/c71922e2babf4404bf2805129f13ff76.gif

提示:以下是本篇文章正文内容,下面案例可供参考

1.ShowWidget.h

代码如下(示例):

#ifndef SHOWWIDGET_H
#define SHOWWIDGET_H#include <QLabel>
#include <QPainter>
#include <QPixmap>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
#include <QPaintEvent>
#include <QDrag>
#include <QMimeData>class ShowWidget : public QWidget
{Q_OBJECTpublic:ShowWidget(QWidget *parent = nullptr);~ShowWidget();void paintEvent(QPaintEvent *paint);QString getStrIndexFriendly() const;void setStrIndexFriendly(const QString &value);void startDrag();signals:void sendData(int num1, int num2);
private:QLabel* m_ImgLab;QLabel* m_InvertedImgLab;QVBoxLayout* m_MainLayout;QString strIndexFriendly;bool bMouseEnter = false;             //记录鼠标是否进入窗口bool bMousePress = false;bool bChecked = false;                   //是否选中QPoint startPos;
private:void enterEvent(QEvent *event) Q_DECL_OVERRIDE;void leaveEvent(QEvent *event) Q_DECL_OVERRIDE;void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;void dragEnterEvent(QDragEnterEvent *event);void dragMoveEvent(QDragMoveEvent *event);void dropEvent(QDropEvent *event);
};#endif // SHOWWIDGET_H

2.ShowWidget.cpp

代码如下(示例):

#include "showwidget.h"#include <QApplication>ShowWidget::ShowWidget( QWidget *parent): QWidget(parent)
{this->setAcceptDrops(true);
}
ShowWidget::~ShowWidget()
{}
void ShowWidget::paintEvent(QPaintEvent *paint)
{Q_UNUSED(paint);QRect rcBody = rect();QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);  // 反锯齿;painter.setPen(Qt::NoPen);//画一圈红色的外框if (bMouseEnter || bChecked){painter.setPen(QPen(QColor(255, 0, 0)));painter.drawRoundRect(rcBody,20,20);}//绘制背景QColor colorBackGround = QColor(155, 155, 155);if (bMouseEnter || bChecked)colorBackGround = QColor(180, 180, 180);painter.setBrush(colorBackGround);//绘制底图if (property("background-image").isValid()){QImage imageData = property("background-image").value<QImage>();if (!imageData.isNull())painter.setBrush(imageData.scaled(rcBody.size()));}painter.drawRoundedRect(rcBody, 5, 5);//绘制文字QString strIndexFriendly = getStrIndexFriendly();int nSize = qMin(width(), height());nSize = qMin(nSize, 18);if (bMouseEnter || bChecked)nSize = qMin(nSize+2, 22);QFont font;font.setPixelSize(nSize);painter.setFont(font);painter.setPen(Qt::white);if (bMouseEnter || bChecked)painter.setPen(Qt::black);painter.drawText(rect(), Qt::AlignCenter, strIndexFriendly);
}QString ShowWidget::getStrIndexFriendly() const
{return strIndexFriendly;
}void ShowWidget::setStrIndexFriendly(const QString &value)
{strIndexFriendly = value;
}void ShowWidget::enterEvent(QEvent *event)
{Q_UNUSED(event);bMouseEnter = true;update();
}void ShowWidget::leaveEvent(QEvent *event)
{Q_UNUSED(event);bMouseEnter = false;update();
}void ShowWidget::mouseMoveEvent(QMouseEvent *event)
{if (!acceptDrops())return;if (!bMousePress)return;if (!(event->buttons() & Qt::LeftButton))return;int distance = (event->pos()-startPos).manhattanLength();if (distance>=QApplication::startDragDistance())startDrag();
}void ShowWidget::mousePressEvent(QMouseEvent *event)
{if (event->button()==Qt::LeftButton){bMousePress = true;startPos = event->pos();}QWidget::mousePressEvent(event);
}void ShowWidget::mouseReleaseEvent(QMouseEvent *event)
{if(event->button() & Qt::LeftButton)bMousePress = false;
}void ShowWidget::startDrag()
{QDrag *drag = new QDrag(this);QMimeData *mimeData = new QMimeData;mimeData->setText(getStrIndexFriendly());drag->setMimeData(mimeData);QPixmap pixmap = this->grab();if (!pixmap.isNull()){//设置缩略图drag->setPixmap(pixmap);//设置鼠标在缩略图上的位置drag->setHotSpot(QPoint(0, pixmap.height()/2));drag->exec();}
}void ShowWidget::dragEnterEvent(QDragEnterEvent *event)
{event->setDropAction(Qt::MoveAction);event->accept();
}void ShowWidget::dragMoveEvent(QDragMoveEvent *event)
{event->setDropAction(Qt::MoveAction);event->accept();
}void ShowWidget::dropEvent(QDropEvent *event)
{QString str = event->mimeData()->text();QString arr = getStrIndexFriendly();emit sendData(str.toInt(),arr.toInt());event->setDropAction(Qt::MoveAction);event->accept();
}

3.MainWindow.h

代码如下(示例):

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QFileDialog>
#include <QGridLayout>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QMessageBox>
#include <QDesktopServices>
#include <QRandomGenerator>
#include "showwidget.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void on_lineEdit_2_textEdited(const QString &arg1);void on_lineEdit_textEdited(const QString &arg1);void getData(int num1, int num2);void on_pushButton_2_clicked();void on_pushButton_3_clicked();private:Ui::MainWindow *ui;int xcount = 3, ycount = 4;QGridLayout *gridLayoutScreenMap;            //屏幕窗口表格布局QList<ShowWidget *> ShowWidgetList;QList<QImage > myimage;QMap<int, QImage > imagelist;QList<int > rnum;QList<int > correctnum;QString fileName;int UsedTime = 0;int TotleTime = 0;
private:void dragEnterEvent(QDragEnterEvent *event);void dropEvent(QDropEvent *event);
};
#endif // MAINWINDOW_H

4.MainWindow.cpp

代码如下(示例):

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("拼图游戏---陈淞(可拖动图片)");setToolTip("可拖拽图片到窗口添加资源");gridLayoutScreenMap = new QGridLayout(this);gridLayoutScreenMap->setContentsMargins(0, 0, 0, 0);gridLayoutScreenMap->setSpacing(4);int number = 0;for (int i = 0; i < xcount; i++){for (int j = 0; j < ycount; j++){number++;ShowWidget *pSc = new ShowWidget(this);ShowWidgetList.append(pSc);connect(pSc,&ShowWidget::sendData,this,&MainWindow::getData);pSc->setStrIndexFriendly(QString::number(number));pSc->update();gridLayoutScreenMap->addWidget(pSc, i, j);}}for (int i = 0; i < xcount*ycount; i++){correctnum.append(i);}TotleTime = xcount*ycount+5;ui->label_3->setText(QString("已用次数: %1").arg(0));ui->label_5->setText(QString("总共次数: %1").arg(TotleTime));ui->lineEdit_2->setText(QString::number(xcount));ui->lineEdit->setText(QString::number(ycount));ui->pushButton_3->hide();this->setAcceptDrops(true);ui->widget->setLayout(gridLayoutScreenMap);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{fileName = QFileDialog::getOpenFileName(this,"选择图片","C:/Users/Administrator/Pictures/","图片文件(*.png *.bmp *.jpg)");QPixmap pix;QPixmap pixmap;pix.load(fileName);int nycopy = 0,nxcopy = 0,number = 0;for (int i = 0; i < xcount; i++){for (int j = 0; j < ycount; j++){number++;pixmap = pix.copy(nxcopy,nycopy,pix.width()/ycount,pix.height()/xcount);QImage image;image = pixmap.toImage();imagelist.insert(number - 1, image);pixmap.scaled(ShowWidgetList.at(number - 1)->width(),ShowWidgetList.at(number - 1)->height());ShowWidgetList.at(number - 1)->setProperty("background-image", image);ShowWidgetList.at(number - 1)->setStrIndexFriendly(QString::number(number));ShowWidgetList.at(number - 1)->update();gridLayoutScreenMap->addWidget(ShowWidgetList.at(number - 1), i, j);nxcopy += pix.width()/ycount;}nxcopy = 0;nycopy += pix.height()/xcount;}UsedTime = 0;TotleTime = xcount*ycount+5;ui->label_3->setText(QString("已用次数: %1").arg(UsedTime));ui->label_5->setText(QString("总共次数: %1").arg(TotleTime));rnum.clear();while (rnum.count() < xcount*ycount){rnum.append(QRandomGenerator::global()->bounded(xcount*ycount));rnum.toSet().toList();for (int i = 0; i < rnum.count(); i++){for (int j = 0; j < rnum.count(); j++){if(rnum.at(i) == rnum.at(j) && (i != j))rnum.removeAt(i);}}}for (int i = 0; i < ShowWidgetList.count(); i++){ShowWidgetList.at(i)->setProperty("background-image", imagelist.value(rnum.at(i)));ShowWidgetList.at(i)->update();}
}//拖动进入事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{//检查拖放文件的 MIME 类型信息 拖放的是一个 text/uri-list 数据if (event->mimeData()->hasFormat("text/uri-list")){//我们在事件处理代码中调用 acceptProposeAction()函数,就可以向用户暗示,你可以将拖动的对象放在这个组件上event->acceptProposedAction();}else{event->ignore();}
}//放下事件
void MainWindow::dropEvent(QDropEvent *event)
{const QMimeData *mimeData = event->mimeData();if(mimeData->hasUrls()){QList<QUrl>urlList = mimeData->urls();fileName = urlList.at(0).toLocalFile();if(!fileName.isEmpty()){QPixmap pix;QPixmap pixmap;pix.load(fileName);int nycopy = 0,nxcopy = 0,number = 0;for (int i = 0; i < xcount; i++){for (int j = 0; j < ycount; j++){number++;pixmap = pix.copy(nxcopy,nycopy,pix.width()/ycount,pix.height()/xcount);QImage image;pixmap.scaled(ShowWidgetList.at(number - 1)->width(),ShowWidgetList.at(number - 1)->height());image = pixmap.toImage();imagelist.insert(number - 1, image);ShowWidgetList.at(number - 1)->setProperty("background-image", image);ShowWidgetList.at(number - 1)->setStrIndexFriendly(QString::number(number));ShowWidgetList.at(number - 1)->update();gridLayoutScreenMap->addWidget(ShowWidgetList.at(number - 1), i, j);nxcopy += pix.width()/ycount;}nxcopy = 0;nycopy += pix.height()/xcount;}}}UsedTime = 0;TotleTime = xcount*ycount+5;ui->label_3->setText(QString("已用次数: %1").arg(UsedTime));ui->label_5->setText(QString("总共次数: %1").arg(TotleTime));rnum.clear();while (rnum.count() < xcount*ycount){rnum.append(QRandomGenerator::global()->bounded(xcount*ycount));rnum.toSet().toList();for (int i = 0; i < rnum.count(); i++){for (int j = 0; j < rnum.count(); j++){if(rnum.at(i) == rnum.at(j) && (i != j))rnum.removeAt(i);}}}for (int i = 0; i < ShowWidgetList.count(); i++){ShowWidgetList.at(i)->setProperty("background-image", imagelist.value(rnum.at(i)));ShowWidgetList.at(i)->update();}
}void MainWindow::on_lineEdit_2_textEdited(const QString &arg1)
{QPixmap pix;QPixmap pixmap;pix.load(fileName);xcount = arg1.toInt();int nycopy = 0,nxcopy = 0,number = 0;foreach (auto *pSc, ShowWidgetList){pSc->disconnect();gridLayoutScreenMap->removeWidget(pSc);delete pSc;pSc = nullptr;}ShowWidgetList.clear();for (int i = 0; i < xcount; i++){for (int j = 0; j < ycount; j++){number++;pixmap = pix.copy(nxcopy,nycopy,pix.width()/ycount,pix.height()/xcount);ShowWidget *pSc = new ShowWidget(this);connect(pSc,&ShowWidget::sendData,this,&MainWindow::getData);pixmap.scaled(pSc->width(),pSc->height());QImage image;image = pixmap.toImage();ShowWidgetList.append(pSc);imagelist.insert(number - 1, image);pSc->setProperty("background-image", image);pSc->setStrIndexFriendly(QString::number(number));pSc->update();gridLayoutScreenMap->addWidget(pSc, i, j);nxcopy += pix.width()/ycount;}nxcopy = 0;nycopy += pix.height()/xcount;}UsedTime = 0;TotleTime = xcount*ycount+5;ui->label_3->setText(QString("已用次数: %1").arg(UsedTime));ui->label_5->setText(QString("总共次数: %1").arg(TotleTime));correctnum.clear();for (int i = 0; i < xcount*ycount; i++){correctnum.append(i);}rnum.clear();while (rnum.count() < xcount*ycount){rnum.append(QRandomGenerator::global()->bounded(xcount*ycount));rnum.toSet().toList();for (int i = 0; i < rnum.count(); i++){for (int j = 0; j < rnum.count(); j++){if(rnum.at(i) == rnum.at(j) && (i != j))rnum.removeAt(i);}}}for (int i = 0; i < ShowWidgetList.count(); i++){ShowWidgetList.at(i)->setProperty("background-image", imagelist.value(rnum.at(i)));ShowWidgetList.at(i)->update();}
}void MainWindow::on_lineEdit_textEdited(const QString &arg1)
{QPixmap pix;QPixmap pixmap;pix.load(fileName);ycount = arg1.toInt();int nycopy = 0,nxcopy = 0,number = 0;foreach (auto *pSc, ShowWidgetList){pSc->disconnect();gridLayoutScreenMap->removeWidget(pSc);delete pSc;pSc = nullptr;}ShowWidgetList.clear();for (int i = 0; i < xcount; i++){for (int j = 0; j < ycount; j++){number++;pixmap = pix.copy(nxcopy,nycopy,pix.width()/ycount,pix.height()/xcount);ShowWidget *pSc = new ShowWidget(this);connect(pSc,&ShowWidget::sendData,this,&MainWindow::getData);pixmap.scaled(pSc->width(),pSc->height());QImage image;image = pixmap.toImage();ShowWidgetList.append(pSc);imagelist.insert(number - 1, image);pSc->setProperty("background-image", image);pSc->setStrIndexFriendly(QString::number(number));pSc->update();gridLayoutScreenMap->addWidget(pSc, i, j);nxcopy += pix.width()/ycount;}nxcopy = 0;nycopy += pix.height()/xcount;}UsedTime = 0;TotleTime = xcount*ycount+5;ui->label_3->setText(QString("已用次数: %1").arg(UsedTime));ui->label_5->setText(QString("总共次数: %1").arg(TotleTime));correctnum.clear();for (int i = 0; i < xcount*ycount; i++){correctnum.append(i);}rnum.clear();while (rnum.count() < xcount*ycount){rnum.append(QRandomGenerator::global()->bounded(xcount*ycount));rnum.toSet().toList();for (int i = 0; i < rnum.count(); i++){for (int j = 0; j < rnum.count(); j++){if(rnum.at(i) == rnum.at(j) && (i != j))rnum.removeAt(i);}}}for (int i = 0; i < ShowWidgetList.count(); i++){ShowWidgetList.at(i)->setProperty("background-image", imagelist.value(rnum.at(i)));ShowWidgetList.at(i)->update();}
}void MainWindow::getData(int num1, int num2)
{qDebug()<< "num1 = " << num1 << "num2 = " << num2;qDebug()<< "ShowWidgetList.count() = " << ShowWidgetList.count();QImage image = ShowWidgetList.at(num1 - 1)->property("background-image").value<QImage>();ShowWidgetList.at(num1 - 1)->setProperty("background-image", ShowWidgetList.at(num2 - 1)->property("background-image").value<QImage>());ShowWidgetList.at(num2 - 1)->setProperty("background-image",image);ShowWidgetList.at(num1 - 1)->update();ShowWidgetList.at(num2 - 1)->update();UsedTime++;ui->label_3->setText(QString("已用次数: %1").arg(UsedTime));rnum.swap(num1 - 1, num2 - 1);qDebug()<< "rnum = " << rnum << "correctnum = " << correctnum;if(correctnum == rnum){QMessageBox::information(this,"恭喜","恭喜您成功完成拼图!",QMessageBox::Ok);UsedTime = 0;TotleTime = xcount*ycount+5;ui->label_3->setText(QString("已用次数: %1").arg(UsedTime));ui->label_5->setText(QString("总共次数: %1").arg(TotleTime));}if(TotleTime == UsedTime){QMessageBox::warning(this,"抱歉","很遗憾您未能在规定次数内完成拼图!",QMessageBox::Ok);UsedTime = 0;TotleTime = xcount*ycount+5;ui->label_3->setText(QString("已用次数: %1").arg(UsedTime));ui->label_5->setText(QString("总共次数: %1").arg(TotleTime));ui->pushButton_3->show();}
}void MainWindow::on_pushButton_2_clicked()
{QPixmap pix;QPixmap pixmap;pix.load(fileName);int nycopy = 0,nxcopy = 0,number = 0;for (int i = 0; i < xcount; i++){for (int j = 0; j < ycount; j++){number++;pixmap = pix.copy(nxcopy,nycopy,pix.width()/ycount,pix.height()/xcount);QImage image;image = pixmap.toImage();imagelist.insert(number - 1, image);pixmap.scaled(ShowWidgetList.at(number - 1)->width(),ShowWidgetList.at(number - 1)->height());ShowWidgetList.at(number - 1)->setProperty("background-image", image);ShowWidgetList.at(number - 1)->setStrIndexFriendly(QString::number(number));ShowWidgetList.at(number - 1)->update();gridLayoutScreenMap->addWidget(ShowWidgetList.at(number - 1), i, j);nxcopy += pix.width()/ycount;}nxcopy = 0;nycopy += pix.height()/xcount;}UsedTime = 0;TotleTime = xcount*ycount+5;ui->label_3->setText(QString("已用次数: %1").arg(UsedTime));ui->label_5->setText(QString("总共次数: %1").arg(TotleTime));rnum.clear();while (rnum.count() < xcount*ycount){rnum.append(QRandomGenerator::global()->bounded(xcount*ycount));rnum.toSet().toList();for (int i = 0; i < rnum.count(); i++){for (int j = 0; j < rnum.count(); j++){if(rnum.at(i) == rnum.at(j) && (i != j))rnum.removeAt(i);}}}for (int i = 0; i < ShowWidgetList.count(); i++){ShowWidgetList.at(i)->setProperty("background-image", imagelist.value(rnum.at(i)));ShowWidgetList.at(i)->update();}
}void MainWindow::on_pushButton_3_clicked()
{for (int i = 0; i < ShowWidgetList.count(); i++){ShowWidgetList.at(i)->setProperty("background-image", imagelist.value(i));ShowWidgetList.at(i)->update();}ui->pushButton_3->hide();
}

Qt实现简单拼图游戏相关推荐

  1. H5原生js简单拼图游戏

    H5原生js简单拼图游戏 演示地址 效果展示 源码 index.html puzzle.css puzzle.js 源码下载 演示地址 链接: 演示地址 效果展示 源码 index.html < ...

  2. 第18篇 Qt实现简单五子棋游戏(二)算法说明

    第18篇 Qt实现简单五子棋游戏(二)算法说明 5.算法说明 5.1.画棋盘: void drawChessboard(); 5.2.画棋子:void drawChess(); 5.3.鼠标点击响应: ...

  3. linux qt5.7下打地鼠源程序,QT实现简单打地鼠游戏

    本文实例为大家分享了QT实现简单打地鼠游戏的具体代码,供大家参考,具体内容如下 开发工具:VS2017,qt5.9.8 开发语言:c++ 实现功能: 有若干地鼠洞,每次出现一只地鼠,当击中地鼠后,分数 ...

  4. 用 JavaScript 实现简单拼图游戏

    本篇主要讲解,如何利用原生的 JavaScript 来实现一个简单的拼图小游戏. 线上体验地址:拼图 一.游戏的基础逻辑 想用一门语言来开发游戏,必须先了解如何使用这门语言来实现一些基础逻辑,比如图像 ...

  5. Unity3d制作简单拼图游戏

    本文为原创,如需转载请注明原址:http://blog.csdn.net/cube454517408/article/details/7907247 最近一直在使用Unity,对它有了一些小的使用心得 ...

  6. 用flash制作简单拼图游戏

    简介: 可能有很多玩Flash的朋友都曾和我一样想自己动手制作一个拼图游戏,但是苦于不知道实现的方法或不了解ActionScript(以下简称AS)而心存遗憾.别急,今天盗匪就告诉你如何利用Flash ...

  7. VUE实现的简单拼图游戏

    写在前面 最近玩游戏的时候玩到游戏内置的拼图小游戏,突然唤起我对拼图游戏的热爱了,结果这内置游戏要花钱,在steam上找到的免费拼图游戏也不能自定义图片,想玩其他的图还要花钱.这让我很不爽,就索性自己 ...

  8. HTML 简单拼图游戏

    先不废话,请看演示. 公司要搞这么个微信活动,可现在没有前端开发,没办法,身为打杂总监只好临时顶下这个空缺了.先找了一些 JS 代码,试用了下都不太理想,好一点的写的又太复杂,改起来有难度,干脆撸起袖 ...

  9. Java 简单拼图游戏(实现音乐播放功能)

    此程序为用JAVA编写的拼图小游戏,可通过简单的图片移动实现拼图,并实现音乐播放功能.(此程序只完成简单功能的实现,大佬勿喷) 程序源码下载:点击下载程序源码 软件系统实现 拼图主体为一方形区域,位于 ...

最新文章

  1. linux shell程序代码,linux shell实用程序源代码pidof
  2. python官网打不开-python为什么打不开
  3. idea maven项目下载源码及关联源码
  4. Mac中AndroidStudio没有找到Plugins的问题
  5. mysql uroot p f_Mysql 5.7安装
  6. 【Elasticsearch】2021 年的顶级 ETL 工具......以及对 ETL 说“不”的理由
  7. 使用at任务定点执行
  8. 完整的企业机房设计(上)
  9. 【CSP】201903-1 小中大
  10. 浅谈老妈的QQ号被盗之后
  11. 最全的“四大天王”合影集(绝对经典…
  12. Php扫码签到功能怎么实现,python扫码签到程序python中如何定义类
  13. 计算机高级职称论文写什么题目,高级职称论文格式的要求
  14. 台式计算机硬件组装步骤,电脑硬件组装详细步骤有哪些
  15. Ubuntu 安装Trac
  16. c语言一段scanf代码,各位谁有c语言中 scanf 语句的源代码 请发邮箱 wsk456@163.com 小弟不胜感激~谢谢~...
  17. python gps模块_树莓派连接GPS模块
  18. Win32病毒入门(一)
  19. NPDP门径管理流程Stage-Gate之Stage(阶段)
  20. 主板芯片组的南桥和北桥

热门文章

  1. 综合日语第一册第十五课
  2. 欢迎使用CS方分分分n编辑器
  3. win10系统快速进入bios的设置方法
  4. 影响债市行情的主要因素_决定债券收益的十大因素
  5. kubernetes dashboard
  6. Excel中随机生成数字,函数RANDBETWEEN()的使用
  7. Vim编辑器的基本使用(二)末行模式中的命令
  8. 笔记7.28 数据库经典问题
  9. Word2010下划线不显示
  10. oracle 查询 降序排列,Oracle 子查询,按降序排列,取前n条