QT环境下实现UI界面的“拼图游戏”
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界面的“拼图游戏”的更多相关文章
- qt 环境下mapx组件的鼠标跟踪
经过两天的研究mapx组件人坐标转换还是没有转换成功,因为不管怎么变,定点转换的经纬度坐标始终与期望的值有较大的偏差.最后还是想老大请教了一下,划了半天功夫就研究出来了(不愧是老大,仰慕之情犹如滔滔江 ...
- 多线程环境下的UI异步操作
转自原文 多线程环境下的UI异步操作 解决VS中,线程间不可互操作的问题,一揽子解决方案: 一.首先,定义一个类:SetControlProperty using System.Reflection; ...
- 在桌面Linux环境下开发图形界面程序的方案对比
在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...
- 在 Windows 和 Linux(Gnome) 环境下 从命令界面打开网页的方式
1.在 Windows 中 通过命令 可以打开网页是很简单的: start http://www.baidu.com 或 start iexplorer http://www.baidu.com 第二 ...
- Qt 环境下的mapx控件-------2
今天花了一天的时间去查找mapx相关的资料,但是到最后想要的东西还是一无所获,不过还是学到了很多东西.下面以大家分享一下: mapx软件的安装:下载后安装mapx软件,成功后会在安装路径下存在acti ...
- Qt 环境下的activex控件编程-------1
本人第一次接触这种activeX控件的东西,参考了网上很多的教程,终于耗时三个多小时初步理解并编写了一个小demo,现在分享给大家,希望大家少走弯路.步骤如下: 1>像平常创建项目一样创建一个d ...
- qt环境下Mapx组建的编程---------regoin
#include "widget.h" #include "ui_widget.h" #include <QPushButton> #include ...
- qt 环境下mapx组件打包后编译产生c2248和c2512错误
C:\Qt\Qt5.6.0\5.6\msvc2013\include\QtCore\qmetatype.h:760: error: C2248: “MapSpace::IRowCursor::IRow ...
- Qt 环境下MAPX组件的编程
使用mapx打包文件可以方便的迅速开发,今天介绍一种不使用打包文件,直接使用mapx组件的编程方法. 就像之前介绍flash控件编程的方法,首先建立一个qt demo.基于那个的窗口都可以. 本den ...
随机推荐
- Git基础 —— Github 的使用
Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 Github 的利用 Gith ...
- [Linux] - Linux安装JDK
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html <官方JDK下载 之后 ...
- C#学习笔记(九):函数、代码查询和调试
代码查询和调试 代码查询 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- NS3 实验脚本的编写步骤
第一步:配置主机,安装模块 (1)创建N个节点: NodeContainer nodes; nodes.Creat(N); 比如我目前接触到的PointToPoint,N就是2 (2)利用拓扑助手He ...
- sliva数据库简介--转载
sliva rRNA数据库(http://www.arb-silva.de/)用来检查和比对RNA序列,既可以针对16S/18S,SSU,也可以针对23S/28S, LSU,包括了Bacteria, ...
- axios post请求报错
问题描述: vue中使用axios提交post请求, 请求地址及参数都对, 但是一直报缺少参数的错误 探索:对比post请求数据, 提交数据的方式不对 (1)axios的post请求(返回响应缺少参数 ...
- Java 打开Excel,往Excel中存入值,保存的excel格式分别是xls和xlsx
https://mirrors.cnnic.cn/apache/poi/xmlbeans/release/src/ package Excel; import org.apache.poi.hssf. ...
- gulp4小demo
本来想着用gulp搭建一个自动化构建工具,结果一顿报错,后来发现我重新安装的gulp版本是4.0.0,与3版本还是不太一样的,遂记之. Gulp 3版本Demo: const gulp = requi ...
- django用包来组织模型
在我们使用python manage.py startapp xxx命令创建新的应用时,Django会自动帮我们建立一个应用的基本文件组织结构,其中就包括一个models.py文件.通常,我们把当前应 ...
- ActivityGroup实现tab功能
android.app包中含有一个ActivityGroup类,该类是Activity的容器,可以包含多个嵌套进来的 Activitys,这篇文章就是借助ActivityGroup可以嵌套Activi ...