在推荐郁金香之后,我发现它不适用于复制。我开始调试这个程序,首先从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时间戳更新需要什么?
发布于 2009-04-12 15:53:57
我试着做这样的事情:
QApplication app(argc, argv);
// Paste something to your clipboard
app.processEvents();这实际上使得进程的事件循环都是挂起的事件--如果您不像第一个示例那样调用app.exec(),并且非常类似于您在第二个例子中所做的事情,那么如果您实际上使用一个计时器来做一些等效的事情,就不会发生这种情况。不过,我还没有尝试过,这也与文档的建议(将剪贴板作为对用户输入事件的响应)相去甚远。
发布于 2009-08-27 23:08:01
我相信你在X11上运气不好。由应用程序本身来管理X11剪贴板。因此,当应用程序关闭剪贴板上的数据时,数据将丢失。
我认为最好的方法是调用命令行xclip命令。将你想要的文本排入剪贴板。我不知道这个命令通常有多可用。它一定在做一些可以用较低级别的x代码重新创建的东西?
https://stackoverflow.com/questions/741129
复制相似问题