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

X11では運が悪いと思います。X11 クリップボードを管理するのはアプリケーション自体です。したがって、アプリケーションがクリップボードのデータを閉じると、データは失われます。

コマンドラインコマンドを呼び出すのが最善の策だと思いますxclip。クリップボードに必要なテキストをパイプします。このコマンドが通常どの程度利用できるかはわかりません。そして、それは低レベルの x コードで再作成できる何かをしているに違いありませんか?

于 2009-08-27T23:08:01.527 に答える