日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

使用QT制作桌面小工具(一)

發布時間:2025/5/22 c/c++ 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic: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_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic: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_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic: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(); }void Widget::on_exitAppAction() {exit(0); }

效果圖如下:

開發未完,后續會繼續更新…

總結

以上是生活随笔為你收集整理的使用QT制作桌面小工具(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。