Skip to content

庄朋龙的博客

有志者自有千方万计,无志者只感千难万难。

Menu
  • 首页
  • 生活
  • 创业
  • 编程
  • 运维
  • 视频课程
    • 跨境独立站
    • Shopee跨境电商
    • TEMU跨境电商
  • 资源分享
    • 网站推荐
    • 开源推荐
    • 可商用字体
    • 书籍分享
Menu

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

Posted on 2016年1月10日2025年3月4日 by 庄朋龙

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

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() 启动定时器 时得到的标示符一致 如果一致才是真正的 “时间到了”

Category: 资源分享

全栈开发者×创业偏执狂

相信代码能改变命运,也相信凌晨四点的服务器警报里有真实的人生。

我的创业项目:
SHOPAGG / SmallShop / DigitShops / 文硕阁

© 2025 庄朋龙的博客