QT环境下实现UI界面的拼图

来源:互联网 发布:软文 知乎 编辑:程序博客网 时间:2024/06/02 18:30

MainWindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QWidget>#include <QtGui>#include <QMainWindow>#include<QLabel>namespace Ui {    class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();    void cutimage();    void Random();    void moveImage();    void mousePressEvent(QMouseEvent *event);    void reset();    QTimer *timer;    QString strFileName;//文件名    QImage* pSourceImage;//原图    QLabel* pLbImage[9];//九宫格label    QImage pImage[9];    int pCompare[3][3];//i行j列的初始化图片,将移动后的图片进行比较    int num=0;    int tim=0;private slots:    void on_new_2_clicked();    void on_replay_clicked();    void on_quit_clicked();    void on_timeOut();private:    Ui::MainWindow *ui;};#endif // MAINWINDOW_H


main.cpp


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



mainwindow.cpp


#include "mainwindow.h"#include "ui_mainwindow.h"#include<QFileDialog>#include<QMouseEvent>#include<QMessageBox>#include<QTime>#include<QtGlobal>#include<QTimer>#define SMALL_W 100#define SMALL_H 100#define PHOTO_X 20#define PHOTO_Y 40MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    timer=new QTimer(this);             //计时    connect(timer,SIGNAL(timeout()),SLOT(on_timeOut()));    //连接时间槽    num=0;    ui->label_2->setText(QString::number(num));    tim=0;    ui->time_label->setText(QString::number(tim));    pSourceImage=NULL;          //将pSourceImage初始化    for(int i=0;i<9;i++)        //将label分割成九宫格    {        pLbImage[i]= new QLabel(this);        pLbImage[i]->setGeometry(0,0,SMALL_W,SMALL_H);        pLbImage[i]->move(PHOTO_X+SMALL_W*(i%3),                          PHOTO_Y+SMALL_H*(i/3));        pLbImage[i]->setFrameShape(QFrame::Box);    }    this->setStyleSheet(                "MainWindow{border-image: url(:/beijing.jpg);}");}MainWindow::~MainWindow(){    delete ui;}void MainWindow::on_new_2_clicked(){    //打开对话框    QString name =            QFileDialog::getOpenFileName(this,                                         "select pictures",                                         "/home/newcapec",                                         "Images(*.png *.jpg)");    if(name.isEmpty())        return ;    strFileName=name;   if(NULL!=pSourceImage)       //判断是否为空,如果不是第一次,释放pSourceImage   {       delete pSourceImage;       pSourceImage=NULL;   }   pSourceImage = new QImage(strFileName);   if(NULL==pSourceImage)           //判断是否申请成功   {       return ;   }   QImage tep=pSourceImage->scaled(ui->label->width(),                                   ui->label->height());   ui->label->setPixmap(QPixmap::fromImage(tep));   cutimage();}void MainWindow::cutimage(){    QImage temp = pSourceImage->scaled(SMALL_W*3,SMALL_H*3);//缩放    for(int i=0;i<9;i++)    {          pImage[i]=temp.copy((i%3)*SMALL_W,               //要复制图片的坐标,x,y                            (i/3)*SMALL_H,                                     SMALL_W,                                     SMALL_H);           //图片的大小        pLbImage[i]->setPixmap(QPixmap::fromImage(pImage[i]));//加载图片        pCompare[i/3][i%3]=i;                       //初始化    }    QPixmap tep(":/blank.jpg");                 //挖空,添加空白图片    pLbImage[8]->setPixmap(tep);    Random();    if(timer->isActive())    {        timer->stop();    }    timer->start(1000);}void MainWindow::Random()//将数组中的数字打乱,即对应的label打乱,然后再一次性打乱图片{    num=0;    ui->label_2->setText(QString::number(num));    tim=0;    ui->time_label->setText(QString::number(tim));    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));    for(int i=0;i<20;i++)    {        int row=0;        int colum=0;        for(int j=0;j<9;j++)        //找到空白格的位置        {            if(pCompare[j/3][j%3]==8)            {                row=j/3;                colum=j%3;                break;            }        }        int direction=qrand()%4;  //随机出来一个方向        switch (direction) {        case 0:     //up            if(row<2)       //判断是否越界,计算的是空格的行列数            {              pCompare[row][colum]=pCompare[row+1][colum];              pCompare[row+1][colum]=8;            }            break;        case 1:         //down             if(row>0)             {                 pCompare[row][colum]=pCompare[row-1][colum];                 pCompare[row-1][colum]=8;             }            break;        case 2:         //left            if(colum>0)            {                pCompare[row][colum]=pCompare[row][colum-1];                pCompare[row][colum-1]=8;            }            break;        case 3:         //right            if(colum<2)            {                pCompare[row][colum]=pCompare[row][colum+1];                pCompare[row][colum+1]=8;            }            break;        default:            break;        }    }    moveImage();}void MainWindow::moveImage()        //move label{    for(int i=0;i<9;i++)    {        int index=pCompare[i/3][i%3];        pLbImage[index]->move(PHOTO_X+SMALL_W*(i%3),                              PHOTO_Y+SMALL_H*(i/3));    }}void MainWindow::mousePressEvent(QMouseEvent *event){//    if(NULL==pSourceImage)//            return ;    if(!timer->isActive())        return ;    bool bflag;    if(event->button() == Qt::LeftButton)//左键点击    {        QPoint pressPoint=event->pos();        if(pressPoint.x()>PHOTO_X && pressPoint.x()<PHOTO_X+SMALL_W*3 //判断点击的地方是否为图片区域           &&pressPoint.y()>PHOTO_Y && pressPoint.y()<PHOTO_Y+SMALL_H*3)        {            bflag=false;            int row = (pressPoint.y()-PHOTO_Y)/SMALL_H;            int col = (pressPoint.x()-PHOTO_X)/SMALL_W;            if(row>0 && pCompare[row-1][col]==8)            //将图片和空白格移动,四个方向            {                pCompare[row-1][col]=pCompare[row][col];                pCompare[row][col]=8;                bflag=true;            }            else if(row<2 && pCompare[row+1][col]==8)            {                pCompare[row+1][col]=pCompare[row][col];                pCompare[row][col]=8;                bflag=true;            }            else if(col>0 && pCompare[row][col-1]==8)            {                pCompare[row][col-1]=pCompare[row][col];                pCompare[row][col]=8;                bflag=true;            }            else if(col<2 && pCompare[row][col+1]==8)            {                pCompare[row][col+1]=pCompare[row][col];                pCompare[row][col]=8;                bflag=true;            }        }    }    if(bflag==true)     //判断复原之后将挖空的那块补全    {        moveImage();        num++;          //记录步数        ui->label_2->setText(QString::number(num));     //将步数十进制数转化成字符串        bool bfinish=true;        for(int i=0;i<9;i++)        {            if(pCompare[i/3][i%3]!=i)//如果数组中的值等于初始值,则表示拼好了                bfinish=false;            if(bfinish==false)                break;        }        if(bfinish==true)        {            timer->stop();            //qDebug("hhhh");            pLbImage[8]->setPixmap(QPixmap::fromImage(pImage[8]));      //补全图片            QMessageBox::about(this, "Sucessful","You are win!");   //游戏成功弹出的对话        }    }}void MainWindow::on_timeOut(){    tim++;    ui->time_label->setText(QString::number(tim));}void MainWindow::on_replay_clicked()      //重来{    if(NULL==pSourceImage) return ;    num=0;    ui->label_2->setText(QString::number(num));    tim=0;    ui->time_label->setText(QString::number(tim));    Random();    QPixmap tep(":/blank.jpg");    pLbImage[8]->setPixmap(tep);    if(timer->isActive())    {        timer->stop();    }    timer->start(1000);}void MainWindow::on_quit_clicked()      //退出{    if (!(QMessageBox::information(this,tr("CT Control View"),tr("Do you really want to quit the game?"),tr("Yes"),tr("No"))))    {       this->close();    }}



原创粉丝点击