首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 開發實戰:實現全螢幕截圖、拖選區域、置頂顯示與剪貼板複製

     編輯:關於C語言

需求:按熱鍵(Shift+Z)喚起全螢幕截圖模式,鼠標拖選矩形區域,釋放滑鼠後自動將截圖置頂顯示並複製到剪貼板,支持多截圖共存、雙擊關閉、托盤菜單管理。內存優化後空閒佔用 ~4MB。

核心技術點

  • QPixmap::grabWindow(QApplication::desktop()->winId()):一次性抓取全螢幕畫面。
  • QLabel 繼承類 CTopLabel 作為截圖覆蓋層,重寫 paintEvent 繪製選區框/結果圖。
  • 熱鍵註冊:Windows API RegisterHotKey + nativeEvent 過濾 WM_HOTKEY。
  • 置頂無邊框:Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint。
  • 剪貼板:QApplication::clipboard()->setPixmap(resultPixmap)。
  • 內存釋放:截圖完成後 fullScreenPixmap.loadFromData(nullptr) 釋放全屏大圖。

關鍵類結構

MainWindow(主控制器,隱藏)

  • 註冊全局熱鍵(Shift+Z)。
  • 管理 CTopLabel 列表,響應其關閉信號釋放內存。
  • 系統托盤圖標:顯示/隱藏、關於、清除所有截圖、退出。

CTopLabel(截圖覆蓋層)

enum ShotState { InitShot, BeginShot, FinishShot };
ShotState currentState;
QPixmap fullScreenPixmap;  // 全屏背景
QPixmap resultPixmap;      // 截圖結果
QPoint beginPoint, endPoint;
QRect shotRect;
bool isShot, isPressed;

void mousePressEvent  -> 記錄起點,進入 BeginShot
void mouseMoveEvent   -> 更新 shotRect,repaint()
void mouseReleaseEvent-> 裁剪 resultPixmap,調整幾何大小,發射 shotted(),複製剪貼板
void mouseDoubleClick -> 發射 meClosed(winId) 通知主視窗刪除
void paintEvent       -> 根據狀態繪製:全屏+選框 / 結果圖+邊框

專案文件結構

Ssot.pro
main.cpp / mainwindow.h&cpp
ctoplabel.h&cpp
aboutdialog.h&cpp
resource.qrc (icon.png, about-logo.png, readme.txt)

運行截圖

托盤啟動 托盤菜單 關於對話框

優化心得

  1. repaint() 強制同步重繪,避免調整幾何尺寸時閃爍。
  2. 關閉窗口時 delete 對象,防止內存疊加。
  3. fullScreenPixmap.loadFromData(nullptr) 釋放大圖內存,節省數 MB。
  4. Qt::Tool 旗標使窗口不顯示在任務欄,適合工具型覆蓋層。

源碼地址:https://github.com/pansinm/Ssot
程序下載:https://url.cn/K89Rrn

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved