QMimeData::data()函数调用耗时过长



我正试图在运行Wayland的Linux上检索剪贴板中存储的内容,这是一项更复杂任务的一部分。经过反复尝试,我发现对data()函数的调用需要几秒钟,而在x11上它会立即返回。

这对我来说是一个破坏交易的因素,因为我必须迭代许多可能的mime类型。为了方便地重现这个问题,我包含了以下代码:

#include "mainwindow.h"
#include <QApplication>
#include <QClipboard>
#include <QByteArray>
#include <QMimeData>
#include <QThread>
#include <QDebug>
class ClipMon : public QThread {
public:
void run() override {
QClipboard *board = QApplication::clipboard();
while (true) {
const QMimeData *dt = board->mimeData();
QByteArray bt = dt->data("text/plain");
qDebug() << bt.data() << "n";
}
}
private:
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
ClipMon thr;
thr.start();
return a.exec();
}

我在qDebug()行之前设置了一个断点,程序在几秒钟后恢复执行。它有时会立即运行,但将其他内容复制到剪贴板会再次花费一段时间。

我在Wayland上使用Ubuntu 20.04,并尝试使用Qt 5.12和Qt 5.6。你知道是什么原因造成的吗?非常感谢。

LE:我发现用mimeType调用CCD_ 3函数是";COMPOUND_TEXT";是这里的罪魁祸首。这个调用以及所有后续使用其他mimeTypes的调用将花费很长时间。如果有人能解释,我将不胜感激。

我有点怀疑线程背后的想法,所以我给你的建议是:

剪贴板位于qta-qobject中,因此您可以注册您的应用程序以发出lke信号,例如,当剪贴板中的内容发生变化时,您可以摆脱线程并提高应用程序的性能

这里有一个如何使用lambdas的例子,但你可以继续使用SIGNAL,SLOTS

connect(QApplication::clipboard(), &QClipboard::dataChanged, []()
{
qDebug() << "new data!";
QClipboard* board = QApplication::clipboard();
const QMimeData* dt = board->mimeData();
QByteArray bt = dt->data("text/plain");
qDebug() << bt.data() << "n";
});

最新更新