• 基于 QT 实现一个 Ikun 专属桌面宠物


    Step0、实现思路

    想到的思路有两种:

    1、使用 QT 的状态机模式,参考官网文档,这个模式的解耦最佳

    2、使用原生 Wigets,将窗口设置为透明无框,循环播放桌面宠物的状态

    本文采用第二种思路,实现一个极简版示例。

    Step1、新建 Qt Wigets Application

    Step2、设置透明背景与鼠标事件

    修改 widget.h 头文件,

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. QT_BEGIN_NAMESPACE
    5. namespace Ui { class Widget; }
    6. QT_END_NAMESPACE
    7. class Widget : public QWidget
    8. {
    9. Q_OBJECT
    10. public:
    11. Widget(QWidget *parent = nullptr);
    12. ~Widget();
    13. protected:
    14. void mousePressEvent(QMouseEvent *event); // 鼠标点击事件
    15. void mouseMoveEvent(QMouseEvent *event); // 鼠标移动事件
    16. void paintEvent(QPaintEvent *); // 绘画事件
    17. protected:
    18. QPoint pos;
    19. private:
    20. Ui::Widget *ui;
    21. };
    22. #endif // WIDGET_H

    修改 widget.cpp,

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include
    4. #include
    5. #include
    6. Widget::Widget(QWidget *parent)
    7. : QWidget(parent)
    8. , ui(new Ui::Widget)
    9. {
    10. ui->setupUi(this);
    11. // 设置窗口无边框并且透明背景
    12. this->setWindowFlag(Qt::FramelessWindowHint);
    13. this->setAttribute(Qt::WA_TranslucentBackground);
    14. this->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
    15. }
    16. Widget::~Widget()
    17. {
    18. delete ui;
    19. }
    20. void Widget::mousePressEvent(QMouseEvent* ev)
    21. {
    22. if(ev->button()==Qt::LeftButton)
    23. {
    24. pos=ev->pos();
    25. }
    26. }
    27. void Widget::mouseMoveEvent(QMouseEvent*ev)
    28. {
    29. if(ev->buttons()==Qt::LeftButton)
    30. {
    31. int x,y;
    32. x=ev->pos().x()-pos.x();
    33. y=ev->pos().y()-pos.y();
    34. this->move(this->x()+x,this->y()+y);
    35. }
    36. }
    37. void Widget::paintEvent(QPaintEvent *)
    38. {
    39. QPainter painter(this);
    40. QPixmap pixmap;
    41. pixmap.load("../MyPet/image/pikakun.png");
    42. painter.drawPixmap(0, 0, 128, 128, pixmap);
    43. }

    调整窗口大小,

    Step3、编译打包

    编译运行,

    打包部署,

    1. # linux操作系统下的QT打包部署工具
    2. 官网 https://gitcode.net/mirrors/probonopd/linuxdeployqt
    3. 下载地址 https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
    4. # 赋权,重命名
    5. chmod +x linuxdeployqt-continuous-x86_64.AppImage
    6. sudo mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt
    7. sudo mv linuxdeployqt /usr/local/bin
    8. linuxdeployqt --version
    9. # 配置系统变量
    10. # 例如,QT 安装地址为 /home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/bin/qmake
    11. # 修改文件 ~/.bashrc
    12. vim ~/.bashrc
    13. # add qt env
    14. export PATH=/home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/bin:$PATH
    15. export LIB_PATH=/home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/lib:$LIB_PATH
    16. export PLUGIN_PATH=/home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/plugins:$PLUGIN_PATH
    17. export QML2_PATH=/home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/qml:$QML2_PATH
    18. # 刷新配置
    19. source ~/.bashrc
    20. # 查看 qmake 是否生效
    21. qmake -v
    22. # QT 打包发布 Release 版本的可执行文件 MyPet
    23. # MyPet 直接运行是报错的,需要 linuxdeployqt 打包依赖
    24. linuxdeployqt MyPet -appimage
    25. # Windows 自带 windeployqt.exe

    Windows 下注意一个坑,要打开 QT 命令行,并且在 windeployqt.exe 的根目录下执行打包,否则会出现依赖打包遗漏的情况,

    注意,需要将对应的图片资源放到打包文件夹下,图片资源对应代码中的相对路径/绝对路径,否则在其他相同操作系统的电脑上会找不到图片。

  • 相关阅读:
    LeetCode_二分搜索_简单_367.有效的完全平方数
    ZYNQ之中断机制
    面试中展示的职业成长:如何讲述你的职业历程
    [CTF] 2018-百越杯-Misc-血小板天下第一可爱
    Consul API Gateway 0.4 已正式发布,包括这些新功能
    基于Python+Pygame实现一个俄罗斯方块小游戏【完整代码】
    HashMap、ConcurrentHashMap、HashTable和TreeMap 为啥有的支持key支持null,有的value支持null?
    中国技术的对外输出:Telegram也开始搞小程序应用了
    Ubuntu安装Redis
    ArcGIS矢量化并进行拓扑检查
  • 原文地址:https://blog.csdn.net/weixin_47560078/article/details/132859463