关注QT坐标,多线程动画中坐标的变化。汉诺塔都是吃要的。

我的汉诺塔新解:一种更美的描述。

http://blog.csdn.net/weixin_39788534/article/details/79376528

项目地址:

https://github.com/zhuimengshaonian66/hannuo

2018年 追梦少年 QQ:1131052403 —— Dreamer QQ : 1131052403

开源的狂热爱好者,代码风骚,效率恐怖 —— Open source enthusiasts, code coquettish, efficient horror灾难总是接踵而至,如果我失败了,只能说明我不过是如此程度的男人。

界面是在ui手动添加的,按钮的加载是根据文本框的数字来的

思路就是,ABC三条线就是三个栈,移动时就把按钮压进去。

先看汉诺塔的核心代码,新开了一个线程操作的线程中

 C.push(A.pop());就是按钮在三个栈的出栈与压栈
void MyThread::run()
{
    move(*n, *A, *B, *C);
    btnStart->setEnabled(true);
}
void MyThread::move(int n, ABC &A, ABC &B, ABC &C)
{
    if (n == 0)
    {
        return;
    }
    move(n - 1, A, C, B);
    QThread::msleep(500);
    /// windows下多线程操作GUI会出问题,只能用这个
    e.processEvents();
    C.push(A.pop());
    move(n - 1, B, A, C);
}

下面的类就是模拟一个栈,最关键的是在push函数中,要重新对于按钮进行定位。非常关键。

#ifndef ABC_H
#define ABC_H
#include<stack>
#include<QPushButton>
using std::stack;
class ABC
{
public:
    ABC(int _xmid, int _bottom);
    QPushButton * pop();
    void push(QPushButton * btn);
    unsigned int size();
    void clear();
private:
    stack<QPushButton *> btns;
    int xmid;
    int bottom;
};
#endif // ABC_H



#include "abc.h"
ABC::ABC(int _xmid, int _bottom)
    :xmid(_xmid), bottom(_bottom)
{
}
void ABC::push(QPushButton * btn)
{
    if (!btn)
    {
        return;
    }
    btns.push(btn);
    QSize size = btn->size();
    btn->setGeometry(xmid - size.width() / 2, bottom - btns.size() * 20, size.width(), size.height());
    //btn->show();
}
QPushButton * ABC::pop()
{
    QPushButton * btn = btns.top();
    btns.pop();
    return btn;
}
unsigned int ABC::size()
{
    return btns.size();
}
void ABC::clear()
{
    while (btns.size())
    {
        QPushButton * btn = btns.top();
        btns.pop();
        delete btn;
    }
}

初始化三个栈的时候,就要把他们的坐标记录起来:你可能会问,怎么传递这个坐标,这里告诉大家一个不传的秘法,就是通过鼠标的移动事件来轻松的定位到三条线的坐标。

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),
    A(150, 420),
    B(380, 420),
    C(610, 420),
    t(NULL)
{
    ui->setupUi(this);
}

初始化按钮,setGeometry函数是这个项目的关键,num*30是按钮的宽度,20是按钮的高度。

void Widget::on_btnStart_clicked()
{
    bool isok;
    unsigned int num = ui->txtNum->text().toUInt(&isok);
    if (!isok)
    {
        return;
    }
    ui->btnStart->setEnabled(false);
    A.clear();
    B.clear();
    C.clear();
    this->n = num;
    while (num)
    {
        QPushButton * btn = new QPushButton(this);
        btn->setText(QString::number(num));
        btn->setGeometry(0, 0, num * 30, 20);
        A.push(btn);
        btn->show();
        num--;
    }
    delete t;
    t = new MyThread(&n, &A, &B, &C, ui->btnStart);
    t->run();
}

QT汉诺塔项目详解:多线程动画相关推荐

  1. Tower of Hanoi(汉诺塔)详解

    一个经典的汉诺塔问题,带着我自己的理解给做这个问题的友友们解决一下,包括我本人在做的时候也遇到的一些问题给大家阐述一下.话不多说,来看: 汉诺塔 问题描述: 汉诺塔(Hanoi Tower),又称河内 ...

  2. c语言中的汉诺塔问题详解

    汉诺塔问题是一个古典的数学问题,也是c语言学习中一个用递归方法解题的典型实例,我们先看一下原题. 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A ...

  3. 汉诺塔问题详解 递归实现 C语言

    目录 一.前言 二.游戏规则 三.思路讲解 四.完整代码 五.最终结果展示 一.前言 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,  其中一根柱子 ...

  4. python之汉诺塔问题详解

    #汉诺塔问题 传说古老印度在一个圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片圣庙,一块黄铜板上插着三根宝石针.印度教的主神梵 ...

  5. 算法 汉诺塔-java详解

    第一次看到这个算法时,很懵逼,是在栈那里.想了半天没想到半点跟栈有关系的解法.最后看了答案,是用的递归.但是看了答案还是很懵逼,下面就是博主自己对汉诺塔的一些了解. 有三根木桩,第一根上有n个盘子,最 ...

  6. 走进递归经典——汉诺塔问题详解

    目录 传统艺能

  7. Twain的学习记录和基于Qt的相关开源项目详解

    Twain学习记录和基于Qt的开源项目详解 twpp-qml 适用于 C++11 及更高版本的便携式.仅标头 TWAIN 框架. 原项目作者使用Qtwidget基于Twain静态传输一张图片 我基于h ...

  8. 汉诺塔问题(解出来了带你看洛丽塔)

  9. 汉诺塔问题(递归思想)(堆栈学习)

    #include<stdio.h>//汉诺塔问题运用到递归思想, int num=0 ;//首先要给大家介绍一下堆栈 //想象一下,有一个递归函数当他执行自己本身的程序时 //因为条件满足 ...

最新文章

  1. SoapUI实践:自动化测试、压力测试、持续集成
  2. SpringMVC的概念
  3. ubuntu软件位置(安装位置, 运行文件位置, 缓存位置)
  4. 分布式集群环境下,如何实现session共享三(环境搭建)
  5. Python Django 打印执行过的查询语句
  6. Noi2001食物链-并查集
  7. 记一种数据库水平扩展的技巧
  8. 微服务之consul(一) - 诗码者 - 博客园
  9. php设置排序,7种php基本排序实现方法
  10. 增加表空间大小的四种方法
  11. 基于matlab的车牌定位算法设计与实现,matlab车牌定位系统设计(源码+文档)
  12. python中range和xrange的区别_ZH奶酪:Python中range和xrange的区别
  13. 临时修改 macOS 应用的界面语言
  14. 苹果该怎么办?特朗普誓言将会严厉惩罚外迁公司
  15. DoraemonKit一款功能齐全的Android研发助手
  16. Python全栈工程师(22:Socket编程11-Select解析Socket通信)
  17. 开发微信小程序需要服务器吗?
  18. 互联网大佬“打脸”简史:马云/雷军/罗永浩/刘强东...
  19. 解决破解版matlab2018a打开示例或者帮助需要登录账号或者需要输入激活码问题
  20. 装修后才知道的79件事

热门文章

  1. vue跟layui样式整合!大坑
  2. 23种设计模式之装饰
  3. python给视频加背景音乐_python中加背景音乐如何操作
  4. 数据分析在企业中的三大作用
  5. 如何使用ContentResolver
  6. 水性气凝胶涂料的制备方法,具体实施方式举例
  7. Webp动图的使用方法
  8. 人工神经网络原理图解
  9. 第九篇 Java多线程
  10. python 中阶乘怎么打,如何在Python 中计算N的阶乘