使用QT制作桌面小工具(一)
生活随笔
收集整理的這篇文章主要介紹了
使用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_Hwidget.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_Hwidget.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_Hwidget.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制作桌面小工具(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 数字翻转输出
- 下一篇: 使用QT定时器 隐藏 label