Implémenter un animal de bureau exclusif à Ikun basé sur QT

Étape 0, idées de mise en œuvre

Deux idées me viennent à l'esprit :

1. Utilisez le mode machine d'état de QT et reportez-vous à la documentation du site officiel . Ce mode est le meilleur pour le découplage.

2. Utilisez des Wigets natifs pour définir la fenêtre afin qu'elle soit transparente et sans cadre, et bouclez le statut des animaux de bureau.

Cet article adopte la deuxième idée pour implémenter un exemple minimaliste.

Étape 1. Créez une nouvelle application Qt Wigets

Étape 2. Définir l'arrière-plan transparent et les événements de souris

Modifier le fichier d'entête widget.h,

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    void mousePressEvent(QMouseEvent *event); // 鼠标点击事件
    void mouseMoveEvent(QMouseEvent *event); // 鼠标移动事件
    void paintEvent(QPaintEvent *); // 绘画事件
protected:
    QPoint pos;
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

Modifier widget.cpp,

#include "widget.h"
#include "ui_widget.h"
#include <qpainter.h>
#include <QMouseEvent>
#include <QPaintEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 设置窗口无边框并且透明背景
    this->setWindowFlag(Qt::FramelessWindowHint);
    this->setAttribute(Qt::WA_TranslucentBackground);
    this->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::mousePressEvent(QMouseEvent* ev)
{
    if(ev->button()==Qt::LeftButton)
    {
        pos=ev->pos();
    }
}

void Widget::mouseMoveEvent(QMouseEvent*ev)
{
   
    if(ev->buttons()==Qt::LeftButton)
    {
        int x,y;
        x=ev->pos().x()-pos.x();
        y=ev->pos().y()-pos.y();
        this->move(this->x()+x,this->y()+y);
    }
}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    QPixmap pixmap;

    pixmap.load("../MyPet/image/pikakun.png");

    painter.drawPixmap(0, 0, 128, 128, pixmap);
}

redimensionner la fenêtre,

Étape 3. Compiler et empaqueter

Compiler et exécuter,

Packaging et déploiement,

# linux操作系统下的QT打包部署工具
官网 https://gitcode.net/mirrors/probonopd/linuxdeployqt

下载地址 https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage

# 赋权,重命名
chmod +x linuxdeployqt-continuous-x86_64.AppImage
sudo mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt
sudo mv linuxdeployqt /usr/local/bin
linuxdeployqt --version

# 配置系统变量
# 例如,QT 安装地址为 /home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/bin/qmake

# 修改文件 ~/.bashrc
vim ~/.bashrc
# add qt env
export PATH=/home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/bin:$PATH
export LIB_PATH=/home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/lib:$LIB_PATH
export PLUGIN_PATH=/home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/plugins:$PLUGIN_PATH
export QML2_PATH=/home/sam/MyWorkspace/qt-everywhere-src-6.0.0/qtbase/qml:$QML2_PATH

# 刷新配置
source ~/.bashrc

# 查看 qmake 是否生效
qmake -v

# QT 打包发布 Release 版本的可执行文件 MyPet

# MyPet 直接运行是报错的,需要 linuxdeployqt 打包依赖
linuxdeployqt MyPet -appimage

# Windows 自带 windeployqt.exe

Attention à un écueil sous Windows : vous devez ouvrir la ligne de commande QT et effectuer le packaging dans le répertoire racine de windeployqt.exe, sinon le packaging des dépendances risque de passer inaperçu.

Notez que les ressources d'image correspondantes doivent être placées dans le dossier d'emballage et que les ressources d'image correspondent au chemin relatif/chemin absolu dans le code, sinon l'image ne sera pas trouvée sur d'autres ordinateurs avec le même système d'exploitation.

おすすめ

転載: blog.csdn.net/weixin_47560078/article/details/132859463