使用QT制作桌面小工具

Posted ʚVVcatɞ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用QT制作桌面小工具相关的知识,希望对你有一定的参考价值。

制作目标:

实现一个桌面工具

制作内容:

  • 1.显示图片
  • 2.为窗口添加 ico 图标
  • 3.隐藏窗口边窗
  • 4.窗口置顶
  • 5.实现拖拽操作
  • 6.实现系统托盘、托盘菜单

开发环境

  • QT:5.14.1 MSVC2017 64bit

代码部分:

在程序窗口中显示一张图片

  • QPainter绘图
    • 重写绘图事件,虚函数
    • 如果窗口绘图,必须放在绘图事件里实现
    • 绘图事件内部自动调用,窗口需要重绘的时候,状态改变
  • 绘图设备(QPixmap,QImage,QBitmap,QPicture)
    • QPixmap图片背景透明,针对屏幕进行优化了,和平台相关,不能对图片进行修改
    • QImage 和平台无关,可以对图片进行修改,在线程中绘图
    • QPicture 保存绘图 的状态(二进制文件)

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 paintEvent(QPaintEvent *);

private:
    Ui::Widget *ui;

    QPoint p;

;
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QBitmap>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)

    ui->setupUi(this);


Widget::~Widget()

    delete ui;


void Widget::paintEvent(QPaintEvent *)

    QPainter p(this); //创建画家对象
    p.begin(this);//指定当前窗口为绘图设备
    p.drawPixmap(0, 0, QPixmap("../image/1.png"));  // 显示图片



效果图如下:

为窗口添加 ico 图标


在xxx.pro文件中的末尾添加 RC_ICONS = xxxx.ico ,添加完成后运行项目

效果图如下:

隐藏窗口边窗

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QBitmap>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)

    ui->setupUi(this);

    //去窗口边框
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());

    //把窗口背景设置为透明
    setAttribute(Qt::WA_TranslucentBackground);


Widget::~Widget()

    delete ui;


void Widget::paintEvent(QPaintEvent *)

    QPainter p(this); //创建画家对象
    p.begin(this);//指定当前窗口为绘图设备
    p.drawPixmap(0, 0, QPixmap("../image/1.png"));



效果图如下:

窗口置顶

在不管点击任何程序窗口都能使该程序窗口置于顶层可见。

setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QBitmap>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)

    ui->setupUi(this);

    //去窗口边框
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());

    //把窗口背景设置为透明
    setAttribute(Qt::WA_TranslucentBackground);

    // 窗口置顶
    setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);



Widget::~Widget()

    delete ui;


void Widget::paintEvent(QPaintEvent *)

    QPainter p(this); //创建画家对象
    p.begin(this);//指定当前窗口为绘图设备
    p.drawPixmap(0, 0, QPixmap("../image/1.png"));


实现拖拽操作

以下可以实现,图片能被拖动到桌面的任意位置。

首先定义了三个变量和三个事件,分别用来记录鼠标操作的状态和窗口在桌面上不同的位置。

bool m_bDrag;  // 判断拖拽状态
QPoint mouseStartPoint;   // 鼠标起点坐标
QPoint windowTopLeftPoint;  // 窗口左上角坐标
// 鼠标按下事件
void  mousePressEvent(QMouseEvent *event);
// 鼠标移动事件
void  mouseMoveEvent(QMouseEvent *event);
// 鼠标释放事件
void  mouseReleaseEvent(QMouseEvent *event);

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  mouseReleaseEvent(QMouseEvent *event);
     // 在窗口上显示图片
     void paintEvent(QPaintEvent *);

private :
    bool m_bDrag;
    QPoint mouseStartPoint;
    QPoint windowTopLeftPoint;

private:
    Ui::Widget *ui;

    QPoint p;

;
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMouseEvent>
#include <QTextCharFormat>
#include <QPainter>
#include <QBitmap>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)

    ui->setupUi(this);

    //去窗口边框
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());

    //把窗口背景设置为透明
    setAttribute(Qt::WA_TranslucentBackground);

    // 窗口置顶
    setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);



Widget::~Widget()

    delete ui;


void Widget::paintEvent(QPaintEvent *)

    QPainter p(this); //创建画家对象
    p.begin(this);//指定当前窗口为绘图设备
    p.drawPixmap(0, 0, QPixmap("../image/1.png"));




//拖拽操作
void  Widget::mousePressEvent(QMouseEvent *event)

     if (event->button() == Qt::LeftButton)
    
        m_bDrag =  true ;
         //获得鼠标的初始位置
        mouseStartPoint = event->globalPos();

         //获得窗口的初始位置
        windowTopLeftPoint =  this ->frameGeometry().topLeft();
    


void  Widget::mouseMoveEvent(QMouseEvent *event)

     if (m_bDrag)
    
         //获得鼠标移动的距离
        QPoint distance = event->globalPos() - mouseStartPoint;

         //改变窗口的位置
         this ->move(windowTopLeftPoint + distance);
    


void  Widget::mouseReleaseEvent(QMouseEvent *event)

     if (event->button() == Qt::LeftButton)
    
        m_bDrag =  false ;
    

实现系统托盘、托盘菜单

托盘菜单有以下功能:

  • 显示桌面窗口
  • 隐藏桌面窗口
  • 退出程序

widget.h 文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSystemTrayIcon>
#include <QAction>
#include <QMenu>
#include <QMouseEvent>
#include <QTextCharFormat>
#include <QPainter>
#include <QBitmap>


QT_BEGIN_NAMESPACE
namespace Ui  class Widget; 
QT_END_NAMESPACE

class Widget : public QWidget

    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    QSystemTrayIcon* mSysTrayIcon;
    QMenu *mMenu;
    QAction *mShowMainAction;
    QAction *mExitAppAction;
    QAction *mHideAppAction;
    void createActions();
    void createMenu();

protected :
     //拖拽窗口
     void  mousePressEvent(QMouseEvent *event);
     void  mouseMoveEvent(QMouseEvent *event);
     void  mouseReleaseEvent(QMouseEvent *event);
     void paintEvent(QPaintEvent *);

private :
    bool         m_bDrag;
    QPoint      mouseStartPoint;
    QPoint      windowTopLeftPoint;


private slots:
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
    void on_showMainAction();
    void on_exitAppAction();

private:
    Ui::Widget *ui;

    QPoint p;

;
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#pragma execution_character_set("utf-8")

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)

    ui->setupUi(this);

    setWindowTitle("vvcat");

    //去窗口边框
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());

    //把窗口背景设置为透明
    setAttribute(Qt::WA_TranslucentBackground);

    // 窗口置顶
    setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);


    mSysTrayIcon = new QSystemTrayIcon(this);
    mSysTrayIcon->setIcon(QIcon(":/icon/VVCAT.ico"));
    mSysTrayIcon->setToolTip(QObject::trUtf8("vvcat"));
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
    connect(mSysTrayIcon,&QSystemTrayIcon::messageClicked,[&]()
    this->show();

 );

    //建立托盘操作的菜单
    createActions();
    createMenu();
    //在系统托盘显示此对象
    mSysTrayIcon->show();



Widget::~Widget()

    delete ui;


void Widget::paintEvent(QPaintEvent *)

    QPainter p(this); //创建画家对象
    p.begin(this);//指定当前窗口为绘图设备
    p.drawPixmap(0, 0, QPixmap("../image/1.gif"));




//拖拽操作
void  Widget::mousePressEvent(QMouseEvent *event)

     if (event->button() == Qt::LeftButton)
    
        m_bDrag =  true ;
         //获得鼠标的初始位置
        mouseStartPoint = event->globalPos();

         //获得窗口的初始位置
        windowTopLeftPoint =  this ->frameGeometry().topLeft();
    


void  Widget::mouseMoveEvent(QMouseEvent *event)

     if (m_bDrag)
    
         //获得鼠标移动的距离
        QPoint distance = event->globalPos() - mouseStartPoint;

         //改变窗口的位置
         this ->move(windowTopLeftPoint + distance);
    


void  Widget::mouseReleaseEvent(QMouseEvent *event)

     if (event->button() == Qt::LeftButton)
    
        m_bDrag =  false ;
    



void Widget::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)

    switch(reason)
    case QSystemTrayIcon::Trigger:
        mSysTrayIcon->showMessage(QObject::trUtf8("vvcat"),QObject::trUtf8("welcome use me"),QSystemTrayIcon::Information, 1000);
        break;
    case QSystemTrayIcon::DoubleClick:
        this->show();
        break;
    default:
        break;
    


void Widget::createActions()

    mShowMainAction = new QAction(QObject::trUtf8("Show"), this);
    connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));

    mHideAppAction = new QAction(QObject::trUtf8("Hide"), this);
    connect(mHideAppAction,&QAction::triggered,[&]()this->hide(););

    mExitAppAction = new QAction(QObject::trUtf8("Quit"), this);
    connect(mExitAppAction,SIGNAL(triggered()), this, SLOT(on_exitAppAction()));


void Widget::createMenu()

    mMenu = new QMenu(this);
    mMenu->addAction(mShowMainAction);
    mMenu->addAction(mHideAppAction);
    mMenu->addAction(mExitAppAction);
    mSysTrayIcon->setContextMenu(mMenu);


void Widget::on_showMainAction()

    this->show();


Ubuntu 14.04 上的 QT 应用程序

Qt--基础图形绘制

ios14微信小程序添加到桌面链接失败

QT/QML添加程序图标的方法

我们可以使用 SWIG 为 Qt 应用程序制作 python 绑定吗?

远程桌面连接工具的一些小功能,你值得拥有的技巧