Qt练习小例子 不规则窗口+格子棋游戏

玩游戏的时候,经常会看到很炫酷的游戏启动的小窗口,于是就做个一个大家看看效果 鼠标按住这个窗口可以移动

Snip20160110_10

代码编译运行 就会弹出一个 小机器人窗口 三秒后自动切换到格子棋游戏界面,如下图

Snip20160110_12

鼠标点击棋盘就可以移动小机器人,(只单纯做了个移动 别的都没弄 技术有限 还需要积累)

Snip20160110_11

这个代码逻辑很简单,直接看一下代码吧:

#include "starting.h"
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>

//软件启动画面
Starting::Starting(QWidget *parent) : QWidget(parent)
{
    //去窗口的边框
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());
    //把窗口背景设置为透明
    setAttribute(Qt::WA_TranslucentBackground);
    this->resize(512, 512);
    //设置定时器
    dingshi = startTimer(3000);
}

void Starting::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.drawPixmap(0, 0, QPixmap(":/new/prefix1/Automator.png"));
}

void Starting::mousePressEvent(QMouseEvent *e)
{
    x =  e->x();
    y =  e->y();
}
void Starting::mouseMoveEvent(QMouseEvent *e)
{
    this->move( e->globalPos().x() - x,  e->globalPos().y() - y);
}

void Starting::timerEvent(QTimerEvent *t)
{
    if(t->timerId() == dingshi)
    {
        w.show();
        this->close();
    }
}
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QDebug>
#include <QMouseEvent>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->resize(880, 560);
    this->setMouseTracking(true);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);

    QPen pen;
    pen.setWidth(3);
    pen.setColor(QColor(0,0,0));
    p.setPen(pen);
    p.setPen(pen);

    for(int i = 1; i <= 10; i++)
    {
        if(i <= 6)
            p.drawLine(80,80*i,800,80*i);
        p.drawLine(80*i,80,80*i,480);
    }

    //QPixmap 图片背景透明
    p.drawPixmap(h, l, QPixmap(":/new/prefix1/qizi.png"));
}

void Widget::mousePressEvent(QMouseEvent *ev)
{
    //获取点击的坐标
    int x = ev->x();
    int y = ev->y();
    if (((x - x%80)/80 != 0 ) && ((x - x%80)/80 != 10))
    {
        h = x - x%80;
    }
    if (((y - y%80)/80 != 0 ) && ((y - y%80)/80 != 6))
    {
        l = y - y%80;
    }
    qDebug() <<"X轴:"<< x <<"Y轴:"<< y <<"-----在第"<< (x - x%80)/80 <<"行 - 第"<<(y - y%80)/80<<"列";
    update();
}

上面代码中用得到了qt的QTimerEvent类,使用他的 startTimer(3000) 成员函数用来启动定时 返回值是一个唯一定时器标示符,参数位间隔时间  单位是:毫秒

QTimerEvent类包含描述一个定时器事件的参数。

定时器事件被按规则的间隔发送给有开始定时的一个或多个定时器的对象。

每一个定时器有一个唯一的标识符。

一个定时器被使用QObject::startTimer()开始。

要想使用QT中的QTimerEvent定时器 就必须要重载 void timerEvent(QTimerEvent *) 函数 用来接受定时器发送的标识符

在timerEvent函数里 还要判断一下 接受到的标示符 是否和自己 startTimer() 启动定时器 时得到的标示符一致 如果一致才是真正的 “时间到了”

庄朋龙
庄朋龙

一个爱生活的技术菜鸟

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注