需求:按熱鍵(Shift+Z)喚起全螢幕截圖模式,鼠標拖選矩形區域,釋放滑鼠後自動將截圖置頂顯示並複製到剪貼板,支持多截圖共存、雙擊關閉、托盤菜單管理。內存優化後空閒佔用 ~4MB。
QPixmap::grabWindow(QApplication::desktop()->winId()):一次性抓取全螢幕畫面。QLabel 繼承類 CTopLabel 作為截圖覆蓋層,重寫 paintEvent 繪製選區框/結果圖。RegisterHotKey + nativeEvent 過濾 WM_HOTKEY。Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint。QApplication::clipboard()->setPixmap(resultPixmap)。fullScreenPixmap.loadFromData(nullptr) 釋放全屏大圖。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)

repaint() 強制同步重繪,避免調整幾何尺寸時閃爍。delete 對象,防止內存疊加。fullScreenPixmap.loadFromData(nullptr) 釋放大圖內存,節省數 MB。Qt::Tool 旗標使窗口不顯示在任務欄,適合工具型覆蓋層。源碼地址:https://github.com/pansinm/Ssot
程序下載:https://url.cn/K89Rrn