QT汉诺塔项目详解:多线程动画
2018-03-18 18:50
232 查看
关注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迷宫项目详解:多线程动画
- iOS第三方库Eureka实现定制动画详解(九):将定制的Row集成到项目中
- Android开发--图形图像与动画(五)--详解LayoutAnimationController
- Spring框架(一)环境搭建、配置(xml、注解)、整合JDBC以及项目详解
- C# 实现多线程的同步方法详解
- 使用eclpise新建maven项目时报错详解分析
- Java程序员必备知识-多线程框架Executor详解
- Android小项目之五 splash动画效果
- (图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- Objective-C多线程详解(NSThread、NSOperation、GCD)
- 详解Java设计模式编程中命令模式的项目结构实现
- 多线程详解之GCD
- 多线程详解
- 多线程之 Final变量 详解
- Android基础笔记(十)- 帧动画、补间动画详解、对话框
- 详解JAVA多线程(一)
- Java多线程:ThreadPoolExecutor详解
- Android添加手机黑名单,手机来电拦截实现详解与Demo,一个不错的练手项目,涵盖Android四大组件。
- 项目详解4—haproxy 反向代理负载均衡
- php多线程实现方法及用法实例详解