利用QT的clipboard库监听和设置剪切板
使用QT的Clipboard库,监听和设置uos剪切板变化。经过dbus接口,把uos的剪切板暴露出来,从而进行设置和监听
dbus的创建
- 在C++头文件定义
Q_SLOTS
,和Q_SIGNALS
1 | class Clipboard : public QObject |
- 创建导出dbus接口的xml文件
1 |
|
- 使用工具生成适配器类
qdbusxml2cpp com.deepin.ListenClipboard.xml -i com.deepin.ListenClipboard.xml -a widgetadaptor
- 安装适配器将Widget类中的方法导出
DemoAdaptor adaptor(&w);
剪切板监听
- 调用
connect
,把自己的func
和cilpboard
变化连接一起1
2
3
4void Clipboard::CheckDataToCb()
{
connect(m_clipBoard, &QClipboard::dataChanged, this, &Clipboard::ListenDataToCB);
} - 获取文件图片和文字
图片
1
2
3
4
5
6QImage img = qvariant_cast<QImage>(strMimeData->imageData());
QByteArray imageArray;
QBuffer buffer;
buffer.open(QIODevice::WriteOnly);
img.save(&buffer, "PNG");
imageArray.append(buffer.data());文字
1
2QString strText = strMimeData->text();
qDebug() << "clipboard text received:" << strText;文件
1
2
3
4
5
6
7
8
9
10
11QString strFileList;
QList<QUrl> cbUrls = strMimeData->urls();
for (int i = 0; i < cbUrls.size(); i++) {
QString strFile = cbUrls.at(i).toLocalFile();
if (isFusePath(strFile) || 0 == strFile.size()) {
continue;
}
strFileList += strFile + "\n&t"; // windows约定文件路径分隔符
}
qDebug() << "clipboard file received:" << strFileList;
发送数据至
Q_SIGNALS
1
emit ClipboardChanged(strClipboardData,static_cast<int>(nType));
剪贴板设置
使用dbus绑定接口
SetDataToCB
1
QMetaObject::invokeMethod(parent(), "SetDataToCB", Q_ARG(QString, path),Q_ARG(const int,nType));
设置文件图片和文字
图片
1
2
3
4
5QImage img;
QByteArray arr_base64 = clipboardData.toLatin1();
img.loadFromData(QByteArray::fromBase64(arr_base64));
m_clipBoard->setImage(img);
qDebug() << "set clipboard data as Image";文字
1
2m_clipBoard->setText(clipboardData);
qDebug() << "set clipboard data as text:" << clipboardData;文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20QString CopiedFile;
QString UrlList;
qDebug() << "set clipboard data as file:" << clipboardData;
QStringList clipboardList = clipboardData.split("\n");
for (QString path : clipboardList) {
if (!path.isEmpty()) {
CopiedFile = CopiedFile + "copy\nfile://" + path;
UrlList = UrlList + "file://" + path + "\n";
}
}
if (CopiedFile.size() == 0) {
qDebug() << "clipboard path is empty";
return;
}
QMimeData *newMimeData = new QMimeData();
newMimeData->setData("x-special/gnome-copied-files",
QByteArray(CopiedFile.toStdString().c_str()));
newMimeData->setData("text/uri-list", QByteArray(UrlList.toStdString().c_str()));
m_clipBoard->clear();
m_clipBoard->setMimeData(newMimeData);