Implementar una mascota de escritorio exclusiva de Ikun basada en QT

Paso 0, ideas de implementación

Hay dos ideas que me vienen a la mente:

1. Utilice el modo de máquina de estado de QT y consulte la documentación del sitio web oficial . Este modo es el mejor para desacoplar.

2. Utilice Wigets nativos para configurar la ventana para que sea transparente y sin marco, y repita el estado de las mascotas del escritorio.

Este artículo adopta la segunda idea para implementar un ejemplo minimalista.

Paso 1. Cree una nueva aplicación Qt Wigets

Paso 2. Establecer fondo transparente y eventos del mouse

Modifique el archivo de encabezado 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

Modificar 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);
}

cambiar el tamaño de la ventana,

Paso 3. Compilar y empaquetar

Compilar y ejecutar,

Empaquetado y despliegue,

# 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

Preste atención a un error en Windows: debe abrir la línea de comando QT y realizar el empaquetado en el directorio raíz de windeployqt.exe, de lo contrario, es posible que se pierda el empaquetado de dependencias.

Tenga en cuenta que los recursos de imagen correspondientes deben colocarse en la carpeta de paquete y los recursos de imagen corresponden a la ruta relativa/ruta absoluta en el código; de lo contrario, la imagen no se encontrará en otras computadoras con el mismo sistema operativo.

Supongo que te gusta

Origin blog.csdn.net/weixin_47560078/article/details/132859463
Recomendado
Clasificación