zoukankan      html  css  js  c++  java
  • searchdemo 三.拖拽起始点

      完成目标:让其实顶点可以随着鼠标拖动而改变位置

      途中思路不清,忘记乘以BLOCKSIZE却无法察觉。

      鼠标键按住不放,之后拖动,如果超出主界面会导致程序崩溃。检查之后发现,没有进行坐标范围限定,加入判定函数即ok。

    main:

    C++语言: Codee#26079
    01 #include <QtGui>
    02 #include <QtCore>
    03 #include "pathfinding.h"
    04
    05 int main(int argc, char *argv[])
    06 {
    07     QApplication a(argc, argv);
    08     Widget* window=new Widget;
    09
    10     QRect frect = window->frameGeometry();
    11     frect.moveCenter(QDesktopWidget().availableGeometry().center());
    12     window->move(frect.topLeft());
    13     window->show();
    14
    15     return a.exec();
    16 }

    pathfinding.h

    C++语言: Codee#26080
    01 #ifndef PATHFINDING_H
    02 #define PATHFINDING_H
    03
    04 #include <QtGui>
    05 #include <QtCore>
    06
    07 class Widget : public QWidget
    08 {
    09     Q_OBJECT
    10
    11 public:
    12     Widget(QWidget* parent = 0);
    13     void paintEvent(QPaintEvent* event);
    14     void mousePressEvent(QMouseEvent* event);
    15     void mouseMoveEvent(QMouseEvent* event);
    16     void setWindowPixel(const QPoint& pos, bool opaque);
    17
    18 private:
    19     enum {LENGTH = 910};
    20     enum {WIDTH = 700};
    21     enum {BLOCKSIZE = 35};
    22     bool blocks[LENGTH/BLOCKSIZE][WIDTH/BLOCKSIZE];
    23     bool onDrag;
    24     QPoint cursorpos;
    25     QPoint startBlock;
    26     QPoint endBlock;
    27     bool checkPosition(const QPoint& pos);
    28 };
    29
    30 #endif // PATHFINDING_H

     

    pathfinding.cpp

    C++语言: Codee#26081
    001 #include "pathfinding.h"
    002
    003 Widget::Widget(QWidget* parent)
    004     : QWidget(parent)
    005 {
    006     for (int i = 0; i < LENGTH / BLOCKSIZE; ++i)
    007         for (int j = 0; j < WIDTH / BLOCKSIZE; ++j)
    008             blocks[i][j] = true;
    009     startBlock = QPoint(0, 0);
    010     blocks[0][0] = false;
    011
    012     endBlock = QPoint(10, 10);
    013     blocks[10][10] = false;
    014     onDrag = false;
    015
    016     setAttribute(Qt::WA_StaticContents);
    017     setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    018     this->setMouseTracking(true);
    019     this->setFixedSize(LENGTH, WIDTH);
    020 }
    021
    022 void Widget::paintEvent(QPaintEvent* event)
    023 {
    024     QPainter painter(this);
    025     painter.setOpacity(0.5);
    026     QColor color = Qt::red;
    027
    028     /* draw the start block */
    029     /*
    030     painter.fillRect(QRect(BLOCKSIZE*startBlock.x(), BLOCKSIZE*startBlock.y(),
    031                            BLOCKSIZE, BLOCKSIZE), color);
    032                            */
    033
    034     //qDebug("The startblock pos:%d,%d", startBlock.x(), startBlock.y());
    035     /* draw the simple blocks */
    036     for (int i = 0; i < LENGTH / BLOCKSIZE; ++i)
    037         for (int j = 0; j < WIDTH / BLOCKSIZE; ++j)
    038         {
    039             QPoint cur(i, j);
    040             if (cur == startBlock)
    041                 color = Qt::red;
    042             else if (cur == endBlock)
    043                 color = Qt::green;
    044
    045             else if (!blocks[i][j])
    046                 color = Qt::gray;
    047             else
    048                 color = Qt::white;
    049             painter.fillRect(QRect(BLOCKSIZE * i, BLOCKSIZE * j,
    050                                    BLOCKSIZE, BLOCKSIZE), color);
    051         }
    052
    053     painter.setPen(QPen(Qt::gray));
    054     /* draw the grids */
    055     for (int i = 0; i < LENGTH; i += BLOCKSIZE)
    056         painter.drawLine(i, 0,
    057                          i, WIDTH);
    058     for (int j = 0; j <= WIDTH; j += BLOCKSIZE)
    059         painter.drawLine(0,  j,
    060                          LENGTH, j);
    061
    062     painter.setFont(QFont("Arial", 50));
    063     painter.drawText(rect(), Qt::AlignCenter, "path-finding demo");
    064 }
    065
    066 /* 1. check the cursor's position,if on the start blocks,go to 2,
    067 *    else go to 3;
    068 * 2. drag the start block,set onDrag=true
    069 * 3. just draw the current block
    070 */
    071 void Widget::mousePressEvent(QMouseEvent* event)
    072 {
    073     cursorpos = QPoint(event->pos().x() / BLOCKSIZE,
    074                        event->pos().y() / BLOCKSIZE);
    075     if (cursorpos == startBlock)
    076         onDrag = true;
    077     else
    078     {
    079         setWindowPixel(event->pos(), false);
    080         onDrag = false;
    081     }
    082 }
    083
    084 void Widget::mouseMoveEvent(QMouseEvent* event)
    085 {
    086     /*
    087      * check the cursor's position
    088      * if out of the main window
    089      * the application will faile
    090      */
    091     if (checkPosition(event->pos()))
    092     {
    093         QPoint tmppos = QPoint(event->pos().x() / BLOCKSIZE,
    094                                event->pos().y() / BLOCKSIZE);
    095         if (cursorpos != tmppos &&
    096             (event->buttons() & Qt::LeftButton) ||
    097             (event->buttons() & Qt::RightButton))
    098             //       event->buttons() & Qt::RightButton)
    099         {
    100             //qDebug("Time elapsed: %d ms", time.msecsTo(curTime));
    101             //setWindowPixel(event->pos(), true);
    102             /* is on drag ,use this to change the start
    103              * block's position,clear the old pos
    104              * then take the new pos
    105              */
    106             if (onDrag)
    107             {
    108                 //qDebug("tmppos:%d,%d", tmppos.x(), tmppos.y());
    109                 blocks[startBlock.x()][startBlock.y()] = true;
    110                 startBlock = tmppos;
    111                 blocks[tmppos.x()][tmppos.y()] = false;
    112             }
    113             setWindowPixel(event->pos(), onDrag);
    114         }
    115     }
    116     //cursorpos=tmppos;
    117 }
    118
    119 void Widget::setWindowPixel(const QPoint& pos, bool opaque)
    120 {
    121     int x = pos.x() / BLOCKSIZE;
    122     int y = pos.y() / BLOCKSIZE;
    123     cursorpos = QPoint(x, y);
    124
    125     if (!opaque)
    126         blocks[x][y] = !blocks[x][y];
    127     update();
    128 }
    129
    130 bool Widget::checkPosition(const QPoint& pos)
    131 {
    132     QRect rect(0, 0, LENGTH, WIDTH);
    133     return rect.contains(pos);
    134 }
  • 相关阅读:
    D. Longest Subsequence
    线段树入门HDU_1754
    poj_2503(map映射)
    HDU_4826
    poj_2251
    day 44 单表查询,多表查询
    day43 字段的修改、添加和删除,多表关系(外键),单表详细操作(增删改查)
    day 42 数据库的配置、数据库与表的一些剩余操作、用户操作、数据库表的引擎、数据库的模式、mysql支持的数据类型、约束
    day41 数据库介绍、数据库基本操作
    day 40 线程队列、线程定时器、进程池和线程池、同步与异步、用多线程来写socket服务端与客户端
  • 原文地址:https://www.cnblogs.com/invisible/p/2450263.html
Copyright © 2011-2022 走看看