在推荐了uclip之后,我发现它不适用于复制。我开始调试这个,首先从 QT3 转换到 QT4 看看是否有帮助,但它没有任何区别,最终我发现这是一个已知的错误,但标记为“不会修复”:
这是在创建 QApplication 后立即设置剪贴板的副作用。X11 剪贴板是事件驱动的,因此依赖于来自 X 服务器的当前时间戳。这些时间戳由 QApplication 自动处理。然而,在这个简单的例子中,事件循环没有运行,因此我们没有从 X 服务器获取更新的时间戳,这反过来导致 QClipboard::ownsClipboard() 返回 false。设置剪贴板以响应例如键盘或鼠标事件使这项工作按预期工作。
使用 QClipboard::setText() 的理想最小代码应该类似于以下内容
#include <qapplication.h>
#include <qclipboard.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QClipboard *cb = QApplication::clipboard();
QString input = "Hello clipboard";
cb->setText(input);
return 0;
//return app.exec(); makes no difference from return 0
}
但是正如我所说,这行不通。通过反复试验,我想出了以下可行的方法
#include <qapplication.h>
#include <qclipboard.h>
#include <QTimer>
#include <QtGui>
#include <iostream>
class MyApplication : public QApplication {
Q_OBJECT
public:
MyApplication(int & argc, char ** argv) : QApplication(argc, argv)
{
}
public slots:
void setClipboard()
{
QClipboard *cb = QApplication::clipboard();
QString input = "THIS WORKS";
std::cout << "setText line " << __LINE__+1 << "\n";
cb->setText(input);
}
};
class MainWidget:public QMainWindow {
public:
MainWidget() {
QClipboard *clipboard = QApplication::clipboard();
std::cout << "setText line " << __LINE__+1 << "\n";
clipboard->setText("This will not be copied to the clipboard, apparently also too early");
}
};
int main(int argc, char *argv[])
{
MyApplication app(argc, argv);
QClipboard *cb = QApplication::clipboard();
QString input = "This will not be copied to the clipboard, too early";
std::cout << "setText line " << __LINE__+1 << "\n";
cb->setText(input);
//QTimer::singleShot(3, &app, SLOT(setClipboard())); // 3 ok, 2 not ok
MainWidget mainWid;
//mainWid.show();
QTimer::singleShot(2, &app, SLOT(setClipboard())); // 2 ok, 1 not ok
return app.exec();
}
#include "main.moc"
但是,我确信这既不是最低限度也不是最好的方法。因此,我问,以最小的努力和影响生成这样一个所需的 X11 时间戳更新需要什么?