c++ - QMimeData::data()函数调用花费太长时间才能完成

标签 c++ qt qt5 clipboard mime-types

我试图在运行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:我发现调用mitType为“COMPOUND_TEXT”的data(mimeType)函数是这里的罪魁祸首。此调用以及所有后续的其他mimeTypes调用将花费很长时间。如果有人有解释,我将不胜感激。

最佳答案

我可以怀疑线程背后的想法,所以这是我的建议:
剪贴板位于qobject中,因此您可以注册应用以发出信号,例如当剪贴板中的内容更改时,您可以摆脱线程并提高应用程序的性能
这是一个使用lambda的示例,但您可以继续使用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";
});

关于c++ - QMimeData::data()函数调用花费太长时间才能完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63667921/

相关文章:

android - 为什么使用单线程模型作为主线程来更新 UI?

c++ - 如何跟踪拖放操作的生命周期?

c++ - Qt5 VS 2010 - QtSerialPort 库失败

c++ - 将数字设置为小数点后的 float

c++ - 返回值的完美转发,未定义的行为?

c++ - Apple Clang:无法使用自定义分配器编译对 vector 的 std::erase 调用

qt - PyQt:使用 alpha channel 而不是预乘颜色 channel 创建 QPixmap

python - 如何创建组合框 QItemDelegate

c++ - 链接到使用 cygwin 在 Ubuntu 中编译的 .o 文件

c++ - 是否有可用的*免费* QT UI 测试框架?