当前位置:   article > 正文

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

qt桌面宠物

Step0、实现思路

想到的思路有两种:

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

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

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

Step1、新建 Qt Wigets Application

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

修改 widget.h 头文件,

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  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 <qpainter.h>
  4. #include <QMouseEvent>
  5. #include <QPaintEvent>
  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 的根目录下执行打包,否则会出现依赖打包遗漏的情况,

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/657546
推荐阅读
相关标签
  

闽ICP备14008679号