1

在推荐了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 时间戳更新需要什么?

4

2 回答 2

0

我会尝试一下:

QApplication app(argc, argv);
// Paste something to your clipboard
app.processEvents();

这实际上使 Qt 应用程序的事件循环处理所有未决事件,如果您不像第一个示例中那样调用 app.exec(),则不会发生这种情况,并且与您在第二个示例中所做的非常相似实际上用计时器做一些等效的事情。我还没有尝试过,这也与文档的建议相去甚远(处理剪贴板作为对用户输入事件的响应)。

于 2009-04-12T15:53:57.513 回答
0

我相信你在 X11 上运气不好。由应用程序本身来管理 X11 剪贴板。因此,当您的应用程序关闭剪贴板上的数据时,数据就会丢失。

我认为你最好的选择是调用命令行xclip命令。将剪贴板上所需的文本通过管道传输到其中。我不确定这个命令通常有多可用。它必须在做一些可以用较低级别的 x 代码重新创建的事情吗?

于 2009-08-27T23:08:01.527 回答