使QClipboard :: setText()在X11下工作所需的最小调整量是多少?

时间:2009-04-12 01:31:17

标签: qt x11

推荐uclip后,我发现它无法复制。 我开始调试这个,首先从QT3转换到QT4,看看是否 帮助,但它没有任何区别,最终我发现它 是know bug,但标记为“无法修复”:

  

这是在创建后立即设置剪贴板的副作用   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需要什么 时间戳更新,最小的努力和影响?

2 个答案:

答案 0 :(得分:0)

我会尝试类似的事情:

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

这实际上使Qt应用程序进程的事件循环所有未决事件如果你没有像第一个例子中那样调用app.exec()并且与你在第二个例子中所做的非常相似一个是你实际上做了一个与计时器等效的东西。我没有试过它,这也是文档建议的方法(处理剪贴板作为对用户输入事件的响应)。

答案 1 :(得分:0)

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

我认为最好的办法是调用命令行xclip命令。将您想要的文本在剪贴板中输入。我不确定这个命令通常有多少可用。它必须做一些可以用较低级别的x代码重新创建的东西吗?