main.cpp

#include "mainwindow.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w; w.setFixedSize(760,500); w.setWindowFlags(Qt::WindowCloseButtonHint); w.show(); return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QDebug>
#include <QFileDialog>
#include <QPushButton>
#include <QMouseEvent>
#include <QMessageBox>
#include <QtGlobal>//随意数头文件
#include <QTimer>
#include <QTime> #define SMALL_W 130
#define SMALL_H 100
#define PHOTO_X 20
#define PHOTO_Y 110 MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),
SLOT(onTimerOut())); ui->label_3->setText((QString::number(bushusum)));//步数写入
ui->time_label->setText((QString::number(tim)));//时间
this->setStyleSheet(
"MainWindow{border-image: url(:/beijing.jpg);}");//增加背景图片; // QPixmap tep(":/beijing.jpg");
// MainWindow->setPixmap(QPixmap::fromImage(tep));
// ui->btn->setText("nicai");//最按钮进行命名; pSourceImage=NULL;//制空
// if(pSourceImage==NULL)
// {
// return ;
// }
for(int i=0;i<3;i++){ //将图片划分区域;
for(int j=0;j<3;j++){
pLbImage[i*3+j] = new QLabel(this);
pLbImage[i*3+j]->setGeometry(0,0,SMALL_W,SMALL_H);
pLbImage[i*3+j]->move(PHOTO_X+SMALL_W*i,
PHOTO_Y+SMALL_H*j);
pLbImage[i*3+j]->setFrameShape(QFrame::Box);
} }
connect(ui->btn,SIGNAL(clicked()),this,SLOT(test())); //按键 信号(有按键按下) 链接 槽函数
} MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btn_clicked()
{
//打开对话窗
strFileName =
QFileDialog::getOpenFileName(this,
"select pictures",
"/home/newcapec",
"Images(*.png *.jpg)");
if(strFileName==NULL) return ;
if(NULL!=pSourceImage) //把原来的原来的空间释放掉
{
delete pSourceImage;
pSourceImage = NULL;
}
pSourceImage =new QImage(strFileName);
if(pSourceImage == NULL) return ; QImage tep=pSourceImage ->scaled(ui->label->width(),
ui->label->height());
ui->label->setPixmap(QPixmap::fromImage(tep)); cutimage(); } void MainWindow::onTimerOut()
{
tim++;
ui->time_label->setText((QString::number(tim)));
} void MainWindow::cutimage()//九宫格分割
{
QImage temp = pSourceImage->scaled(SMALL_W*3,
SMALL_H*3);//缩放图片
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
pImage[i][j]=temp.copy(i*SMALL_W, //复制图片开始的坐标;
j*SMALL_H,
SMALL_W,
SMALL_H);//复制图片的大小 pLbImage[i*3+j]->setPixmap(QPixmap::fromImage(pImage[i][j])); //加载图片
pCompare[i][j]=i*3+j;
}
}
QPixmap tep(":/blank.jpg");//挖空
pLbImage[8]->setPixmap(tep);
Random(); } void MainWindow::Random()//打乱
{
bushusum=0;
ui->label_3->setText((QString::number(bushusum)));
tim=0;
ui->time_label->setText((QString::number(tim)));;
int x=-1;
int y=-1;
for(int w=0;w<3;w++){//找到空白格
for(int j=0;j<3;j++){
if(pCompare[w][j]==8){
x=w;
y=j;
break;
}
}
if(x!=-1)
break;
} if(x==-1||y==-1)
return ;
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//产生一个随机数
for(int i=0;i<1000;i++){ //随机空白格的四个方向
int direction = qrand()%4; switch (direction) {
case 0://上
if(x<2){
pCompare[x][y]=pCompare[x+1][y];
pCompare[x+1][y]=8;
x++;
}
break;
case 1://下
if(x>0){
pCompare[x][y]=pCompare[x-1][y];
pCompare[x-1][y]=8;
x--;
}
break;
case 2://左
if(y<2){
pCompare[x][y]=pCompare[x][y+1];
pCompare[x][y+1]=8;
y++;
} break;
case 3://右
if(y>0){
pCompare[x][y]=pCompare[x][y-1];
pCompare[x][y-1]=8;
y--;
}
break;
default:
break;
}
}
moveImage();
if(timer->isActive())
{
timer->stop();
}
timer->start(1000);
} void MainWindow::moveImage()//图片移动
{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
int index = pCompare[i][j];
pLbImage[index]->move(PHOTO_X+i*SMALL_W,
PHOTO_Y+j*SMALL_H);
}
}
} int MainWindow::panduanwancheng ()
{
int y=1;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(pCompare[i][j]!=i*3+j)
{
y=0;
break;
}
}
if(!y) break;
}
return y;
} void MainWindow::mousePressEvent(QMouseEvent *event)
{
int num=0;
if(pSourceImage==NULL) return ;
if(panduanwancheng()) return ;
if(event->button() == Qt::LeftButton
||event->button() == Qt::RightButton)
{
QPoint pressPoint = event->pos();
if(pressPoint.x()>PHOTO_X&&pressPoint.y()>PHOTO_Y
&&pressPoint.x()<PHOTO_X+SMALL_W*3&&pressPoint.y()<PHOTO_Y+SMALL_H*3)
{
int x = (pressPoint.x()-PHOTO_X)/SMALL_W;
int y = (pressPoint.y()-PHOTO_Y)/SMALL_H; //判断向上移
if(x>0&&pCompare[x-1][y]==8)
{
pCompare[x-1][y]=pCompare[x][y];
pCompare[x][y]=8;
num++;
}else if(x<2&&pCompare[x+1][y]==8)//判断向下移
{
pCompare[x+1][y]=pCompare[x][y];
pCompare[x][y]=8;
num++; }else if(y>0&&pCompare[x][y-1]==8)//判断向左移
{
pCompare[x][y-1]=pCompare[x][y];
pCompare[x][y]=8;
num++;
}else if(y<2 && pCompare[x][y+1] == 8)//判断向右移动
{
pCompare[x][y+1] = pCompare[x][y];
pCompare[x][y] = 8;
num++;
}
}
}
bushusum+=num;
ui->label_3->setText((QString::number(bushusum)));
moveImage();//图片移动
if(panduanwancheng()){
timer->stop();
huifu();
} } void MainWindow::huifu ()
{
pLbImage[8]->setPixmap(QPixmap::fromImage(pImage[2][2])); //加载图片
QMessageBox::about(this,"successful","***************************************");
} void MainWindow::on_btn2_clicked()
{
if(pSourceImage==NULL) return ;
QPixmap tep(":/blank.jpg");//挖空
pLbImage[8]->setPixmap(tep);
Random();
} void MainWindow::on_btn2_2_clicked()
{
if (!(QMessageBox::information(this,tr("CT Control View"),tr("Do you really want to quit the game?"),tr("Yes"),tr("No"))))
{
this->close();
}
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QLabel>
#include <QMainWindow> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow(); void cutimage();//九宫格分割 void Random();//打乱 void moveImage();//图片移动 void mousePressEvent(QMouseEvent *event);//鼠标点击事件 int panduanwancheng();//判断完成 void huifu();//在判填充原来挖空的地方 int bushusum;//这个变量储存总步数; QTimer *timer;
int tim; private slots: //在槽函数中 只能包含函数 void on_btn_clicked();
void on_btn2_clicked();
void on_btn2_2_clicked();
void onTimerOut(); private:
Ui::MainWindow *ui;
QString strFileName;//文件名称 QImage* pSourceImage;//原图 QLabel* pLbImage[9];//九宫格label QImage pImage[3][3]; int pCompare[3][3]; //标记数组; //QImage QFrame;
}; #endif // MAINWINDOW_H

QT环境下实现UI界面的“拼图游戏”的更多相关文章

  1. qt 环境下mapx组件的鼠标跟踪

    经过两天的研究mapx组件人坐标转换还是没有转换成功,因为不管怎么变,定点转换的经纬度坐标始终与期望的值有较大的偏差.最后还是想老大请教了一下,划了半天功夫就研究出来了(不愧是老大,仰慕之情犹如滔滔江 ...

  2. 多线程环境下的UI异步操作

    转自原文 多线程环境下的UI异步操作 解决VS中,线程间不可互操作的问题,一揽子解决方案: 一.首先,定义一个类:SetControlProperty using System.Reflection; ...

  3. 在桌面Linux环境下开发图形界面程序的方案对比

    在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...

  4. 在 Windows 和 Linux(Gnome) 环境下 从命令界面打开网页的方式

    1.在 Windows 中 通过命令 可以打开网页是很简单的: start http://www.baidu.com 或 start iexplorer http://www.baidu.com 第二 ...

  5. Qt 环境下的mapx控件-------2

    今天花了一天的时间去查找mapx相关的资料,但是到最后想要的东西还是一无所获,不过还是学到了很多东西.下面以大家分享一下: mapx软件的安装:下载后安装mapx软件,成功后会在安装路径下存在acti ...

  6. Qt 环境下的activex控件编程-------1

    本人第一次接触这种activeX控件的东西,参考了网上很多的教程,终于耗时三个多小时初步理解并编写了一个小demo,现在分享给大家,希望大家少走弯路.步骤如下: 1>像平常创建项目一样创建一个d ...

  7. qt环境下Mapx组建的编程---------regoin

    #include "widget.h" #include "ui_widget.h" #include <QPushButton> #include ...

  8. qt 环境下mapx组件打包后编译产生c2248和c2512错误

    C:\Qt\Qt5.6.0\5.6\msvc2013\include\QtCore\qmetatype.h:760: error: C2248: “MapSpace::IRowCursor::IRow ...

  9. Qt 环境下MAPX组件的编程

    使用mapx打包文件可以方便的迅速开发,今天介绍一种不使用打包文件,直接使用mapx组件的编程方法. 就像之前介绍flash控件编程的方法,首先建立一个qt demo.基于那个的窗口都可以. 本den ...

随机推荐

  1. aws相关文档

    使用 IAM 角色授予对 Amazon EC2 上的 AWS 资源的访问权 https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-gu ...

  2. 51nod 1021 石子归并 区间DP

    1021 石子归并  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  取消关注 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆 ...

  3. 【Coursera】Third Week(1)

    The Early World-Wide-Web 关于CERN 欧洲核子研究组织,除了它为世界物理学所作出的卓越贡献,它还是世界上第一个网站,第一个网络服务器,第一个浏览器的诞生地. Robert C ...

  4. UVa 10201 Adventures in Moving - Part IV

    https://vjudge.net/problem/UVA-10201 题意: 给出到达终点的距离和每个加油站的距离和油费,初始油箱里有100升油,计算到达终点时油箱内剩100升油所需的最少花费. ...

  5. Mui --- 页面之间的传值

    A页面 mui.ajax('http://14.50.2.49:80/default/AppLogin?Prm=' + Prm, { data: {}, //dataType: 'json', typ ...

  6. React Native API之 ActionSheetIOS

    ok!先来演示是下效果: 官网教程:http://reactnative.cn/docs/0.31/actionsheetios.html#content 上代码:引入API组件: import Re ...

  7. 基于Java的三种对象持久化方式

    1:序列化技术: 序列化的过程就是将对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,可以通过管道或线程读取,或通过网络连接将对象 ...

  8. nginx 80 端口默认被占用

    /etc/nginx/sites-enabled,修改该目录下的default文件, 将默认端口号80改为其他端口号, /etc/nginx/nginx.conf 文件配置里的80端口就会生效

  9. 《Blue_Flke》 团队项目用户验收评审

    一.beta冲刺 beta冲刺第一.二天:https://www.cnblogs.com/ruanjgc/p/9226434.html beta冲刺第三天:https://www.cnblogs.co ...

  10. js 文件上传

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...