QT汉诺塔项目详解:多线程动画
关注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汉诺塔项目详解:多线程动画相关推荐
- Tower of Hanoi(汉诺塔)详解
一个经典的汉诺塔问题,带着我自己的理解给做这个问题的友友们解决一下,包括我本人在做的时候也遇到的一些问题给大家阐述一下.话不多说,来看: 汉诺塔 问题描述: 汉诺塔(Hanoi Tower),又称河内 ...
- c语言中的汉诺塔问题详解
汉诺塔问题是一个古典的数学问题,也是c语言学习中一个用递归方法解题的典型实例,我们先看一下原题. 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A ...
- 汉诺塔问题详解 递归实现 C语言
目录 一.前言 二.游戏规则 三.思路讲解 四.完整代码 五.最终结果展示 一.前言 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子, 其中一根柱子 ...
- python之汉诺塔问题详解
#汉诺塔问题 传说古老印度在一个圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片圣庙,一块黄铜板上插着三根宝石针.印度教的主神梵 ...
- 算法 汉诺塔-java详解
第一次看到这个算法时,很懵逼,是在栈那里.想了半天没想到半点跟栈有关系的解法.最后看了答案,是用的递归.但是看了答案还是很懵逼,下面就是博主自己对汉诺塔的一些了解. 有三根木桩,第一根上有n个盘子,最 ...
- 走进递归经典——汉诺塔问题详解
目录 传统艺能
- Twain的学习记录和基于Qt的相关开源项目详解
Twain学习记录和基于Qt的开源项目详解 twpp-qml 适用于 C++11 及更高版本的便携式.仅标头 TWAIN 框架. 原项目作者使用Qtwidget基于Twain静态传输一张图片 我基于h ...
- 汉诺塔问题(解出来了带你看洛丽塔)
- 汉诺塔问题(递归思想)(堆栈学习)
#include<stdio.h>//汉诺塔问题运用到递归思想, int num=0 ;//首先要给大家介绍一下堆栈 //想象一下,有一个递归函数当他执行自己本身的程序时 //因为条件满足 ...
最新文章
- SoapUI实践:自动化测试、压力测试、持续集成
- SpringMVC的概念
- ubuntu软件位置(安装位置, 运行文件位置, 缓存位置)
- 分布式集群环境下,如何实现session共享三(环境搭建)
- Python Django 打印执行过的查询语句
- Noi2001食物链-并查集
- 记一种数据库水平扩展的技巧
- 微服务之consul(一) - 诗码者 - 博客园
- php设置排序,7种php基本排序实现方法
- 增加表空间大小的四种方法
- 基于matlab的车牌定位算法设计与实现,matlab车牌定位系统设计(源码+文档)
- python中range和xrange的区别_ZH奶酪:Python中range和xrange的区别
- 临时修改 macOS 应用的界面语言
- 苹果该怎么办?特朗普誓言将会严厉惩罚外迁公司
- DoraemonKit一款功能齐全的Android研发助手
- Python全栈工程师(22:Socket编程11-Select解析Socket通信)
- 开发微信小程序需要服务器吗?
- 互联网大佬“打脸”简史:马云/雷军/罗永浩/刘强东...
- 解决破解版matlab2018a打开示例或者帮助需要登录账号或者需要输入激活码问题
- 装修后才知道的79件事