移动的实现


系列文章目录

序言

第一章 多文件结构

第二章 核心功能

第三章 UI相关

  • 菜单栏
  • 按钮等

总结


移动的实现

0.思路

首先,我们需要在画图的若干功能中添加移动功能,然后我们需要在ui界面里获取位移的信息,这之后需要选中要移动的区域,最后将移动后的图像呈现在画板上。

1.添加功能

在paintarea.h文件中的画笔枚举变量里添加Move:

class PaintArea : public QWidget
{
    Q_OBJECT
public:
enum ShapeType  //枚举变量,几个图形的选择
    {
            None,
            Line,
            Rectangle,
            Text,
            Ellipse,
            Circle,
            FILL,
            Move
    };

2.设置ui界面

然后我们打开ui界面,选择一个位置添加两个QLineEdit,并将它的名称改为moveX,moveY。再添加了四个QRadioButton,用于指使位移的方向。

3.获取位移信息

首先我们在mainwindow.h文件里添加响应函数:

class MainWindow : public QMainWindow
{
    Q_OBJECT

private slots:
    void on_moveX_textChanged();
    void on_moveY_textChanged();
    void on_moveLeft_clicked();
    void on_moveOn_clicked();
    void on_moveDown_clicked();
    void on_moveRight_clicked();

然后我们在mainwindow.cpp文件中写出这个函数:

extern QString moveX,moveY;

void MainWindow::on_moveX_textChanged()
{
    moveX=ui->moveX->text();
}

void MainWindow::on_moveY_textChanged()
{
    moveY=ui->moveY->text();
}

extern bool zuo,shang;

void MainWindow::on_moveLeft_clicked()
{
    zuo = 1;
    shang = 1;
}

void MainWindow::on_moveOn_clicked()
{
    zuo = 0;
    shang = 1;
}

void MainWindow::on_moveDown_clicked()
{
    zuo = 1;
    shang = 0;
}

void MainWindow::on_moveRight_clicked()
{
    zuo = 0;
    shang = 0;
}

这里我又偷了个懒,设了个全局变量,而没有使用指针,正规的操作是使用指针的。
而设置全局变量后只需先在main.cpp中添加变量声明,然后在使用前引用即可。

4.实现功能

在paintarea.cpp文件里对应添加画文本功能:

void PaintArea::paint(QImage&theImage)
{
	case Move:   //移动
       {
           //获取这片区域的图像
           QColor moveImage[w][h];

           for (int iii = x; iii < x+w;iii++)
           {
               for (int jjj = y; jjj < y+h; jjj++)
               {
                   moveImage[iii-x][jjj-y] = image.pixelColor(iii,jjj);
                    //_sleep(1);
               }
           }
           //把这个地方变成空白再重绘
           for (int iii = x; iii < x+w;iii++)
           {
               for (int jjj = y; jjj < y+h; jjj++)
               {
                   if(iii<700&& iii>0&&jjj>0&& jjj<500)
                   {
                       image.setPixelColor(iii,jjj,QColor(Qt::white));
                   }

               }
           }
           //键盘操作临时图层移动
           int moveXX=0;
           for (int i = 0; i < moveX.length(); i++)
           {
               moveXX=10*moveXX+(moveX[i].digitValue());
           }
           int moveYY=0;
           for (int i = 0; i < moveY.length(); i++)
           {
               moveYY=10*moveYY+(moveY[i].digitValue());
           }

           if(zuo)
           {
               moveXX = 0 - moveXX;
           }
           if(shang)
           {
               moveYY = 0 - moveYY;
           }

           for (int iii = x+moveXX; iii < x+w+moveXX;iii++)
           {
               for (int jjj = y+moveYY; jjj < y+h+moveYY; jjj++)
               {
                   if((iii<700&& iii>0&&jjj>0&& jjj<500))
                   {
                       image.setPixelColor(iii,jjj,moveImage[iii-x-moveXX][jjj-y-moveYY]);
                   }
               }
           }

           break;
       }
}

5.小结

这个功能…只能说实现的很诡异…或者说丑陋。

但是他是可行的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值