feat: 监听剪贴板

This commit is contained in:
sleepwithoutbz
2025-09-22 01:20:43 +08:00
parent 9fe3007600
commit 7d323d9904
4 changed files with 95 additions and 0 deletions

View File

@@ -1,6 +1,7 @@
cmake_minimum_required(VERSION 3.16)
project(cbh VERSION 0.1 LANGUAGES CXX)
include(FetchContent) # FetchContent 支持
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
@@ -9,6 +10,13 @@ set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# sqlite_orm库
FetchContent_Declare(sqliteOrm
GIT_REPOSITORY https://github.com/fnc12/sqlite_orm
GIT_TAG v1.9.1
)
FetchContent_MakeAvailable(sqliteOrm)
# 在这里配置QT路径
SET(QT_SDK_DIR E:/Programs/Qt/6.9.2/mingw_64 CACHE PATH "QT SDK DIR" FORCE)
message("在CMAKE中配置 QT_SDK_DIR 选项指定QT路径; 当前路径: ${QT_SDK_DIR}")
@@ -34,6 +42,7 @@ target_link_libraries(cbh PRIVATE
Qt6::Core
Qt6::Gui
ElaWidgetTools
sqlite_orm::sqlite_orm
)
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.

54
src/clipboard.cpp Normal file
View File

@@ -0,0 +1,54 @@
#include "clipboard.h"
#include "sqlite_orm/sqlite_orm.h"
// using sqlite_orm::datetime;
// using sqlite_orm::default_value;
using sqlite_orm::make_column;
using sqlite_orm::make_storage;
using sqlite_orm::make_table;
using sqlite_orm::primary_key;
// 1. 直接定义静态变量
// static decltype(auto) storage = make_storage("./cbh.db", make_table("CBRows", make_column("id", &CBRow::id, primary_key().autoincrement()),
// make_column("content", &CBRow::content), make_column("time", &CBRow::time)));
// 2. 先创建类型,再定义智能指针
using StorageT = decltype(make_storage("./cbh.db", make_table("CBRows", make_column("id", &CBRow::id, primary_key().autoincrement()),
make_column("content", &CBRow::content), make_column("time", &CBRow::time))));
std::unique_ptr<StorageT> storage;
ClipboardMonitor::ClipboardMonitor(QObject *parent) : QObject(parent) {
// 生成数据库连接
storage =
std::make_unique<StorageT>(make_storage("./cbh.db", make_table("CBRows", make_column("id", &CBRow::id, primary_key().autoincrement()),
make_column("content", &CBRow::content), make_column("time", &CBRow::time))));
storage->sync_schema();
// 获取系统剪贴板
QClipboard *clipboard = QApplication::clipboard();
// 连接 dataChanged 信号到自定义的 onClipboardChanged 槽函数
connect(clipboard, &QClipboard::dataChanged, this, &ClipboardMonitor::onClipboardChanged);
}
ClipboardMonitor::~ClipboardMonitor() {}
void ClipboardMonitor::onClipboardChanged() {
// 获取剪贴板对象
QClipboard *clipboard = QApplication::clipboard();
// 检查是否有文本内容
if (clipboard->mimeData()->hasText()) {
QString text = clipboard->text();
qDebug() << "Clipboard text changed:" << text;
storage->insert(CBRow{
-1,
text.toStdString(),
storage->select(datetime("now")).front(),
});
}
// 你也可以检查其他格式,如图像
// if (clipboard->mimeData()->hasImage()) {
// QPixmap pixmap = clipboard->pixmap();
// // 处理图像...
// }
}

30
src/clipboard.h Normal file
View File

@@ -0,0 +1,30 @@
#pragma once
#include "sqlite_orm/sqlite_orm.h"
#include <QApplication>
#include <QClipboard>
#include <QDebug>
#include <QMimeData>
using sqlite_orm::datetime;
// using sqlite_orm::default_value;
using sqlite_orm::make_column;
using sqlite_orm::make_storage;
using sqlite_orm::make_table;
using sqlite_orm::primary_key;
struct CBRow {
int id;
std::string content;
std::string time;
};
class ClipboardMonitor : public QObject {
Q_OBJECT
public:
ClipboardMonitor(QObject *parent = nullptr);
~ClipboardMonitor();
private slots:
void onClipboardChanged();
};

View File

@@ -2,12 +2,14 @@
#include <QScreen>
#include <QApplication>
#include "window.h"
#include "clipboard.h"
#ifdef Q_OS_WIN
#include <Windows.h>
#endif
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
ClipboardMonitor cbm(&a);
eApp->init();
MainWindow w;
w.show();