我们正在使用QClipboard复制csv文本格式,但是当文本很长时,没有粘贴任何内容。
我们有一个400列的表,每行的csv文本格式为6600个字符。
如果剪贴板文本在20k行左右,则可以粘贴到其他应用程序中,如excel、Number等。但是如果行数大于20k行,则不粘贴任何内容。
你知道吗?
内存信息:物理内存:8GB已使用内存:4GB缓存文件:982 MBSwap Used: 546 MB
谢谢
据我所知,这个问题似乎是您粘贴到的应用程序的限制。为了进行研究,我在Qt程序中添加了以下几行:
QString oneLine;
for (int i=0; i<400; i++) oneLine += "123456789ABCDEF,"; // 400*16 == 6600
oneLine += 'n';
const int LINE_COUNT = 22000;
QString allLines;
for (int i=0; i<LINE_COUNT; i++) allLines += oneLine;
QClipboard * qc = qApp->clipboard();
qc->setText(allLines, QClipboard::Clipboard);
printf("SAVED %i bytes of data to clipboard!n", allLines.size());
…然后我跑Qt程序,然后退出程序,验证,粘贴到数字(v12.1)没有影响。(作为对照,我还尝试了LINE_COUNT
设置为例如20,000而不是22,000,并验证了使用稍微较小的数据集,将数据粘贴到数字中确实有效)
之后,我将以下行添加到另一个Qt程序中:
QClipboard * qc = qApp->clipboard();
QString t = qc->text();
printf("LOADED %i bytes from clipboardn", t.size());
printf("Loaded data was: [%s]n", t.toUtf8().constData());
…然后,当我运行第二个Qt程序时,我看到它打印出预期的字节数和(非常大!)MacOS剪贴板中存在的csv数据量,正如预期的那样——这表明数据确实进入了Mac剪贴板,这表明Numbers只是拒绝处理它。在第二个Qt程序无法再看到剪贴板数据之前,我能够将LINE_COUNT增加到大约40,650行(也就是268,396,660字节)(在40,660行或更高时,Qt程序说剪贴板包含0字节)。
至于为什么Qt- Qt剪贴板传输在这种大小下停止工作,我真的不能说,尽管我怀疑剪贴板服务的设计者(无论是在苹果还是在Qt)从来没有真正打算让它一次用于这么多的文本。我确实注意到268,396,660大约是(2^32-1)的1/16,所以如果文本数据在某个时候被扩展了8倍,并且遇到带符号的32位计数器溢出或其他问题,我不会感到惊讶。