2009-04-12 6 views
0

Nach der Empfehlung uclip habe ich festgestellt, dass es nicht zum Kopieren funktioniert. Ich begann das Debuggen, zuerst von QT3 auf Qt4 Umwandlung zu sehen, ob die geholfen, aber es hat keinen Unterschied machen, und schließlich fand ich, dass es ein know bug ist aber markiert als „Werde nicht fix“:Was ist der Mindestumfang an Optimierungen, um QClipboard :: setText() unter X11 zu verwenden?

Dies ist ein Nebeneffekt der Einstellung der Zwischenablage sofort nach dem Erstellen QApplication. Die X11-Zwischenablage ist ereignisgesteuert und benötigt daher die aktuellen Zeitstempel vom X-Server. Diese Zeitstempel werden automatisch von QApplication behandelt. In diesem einfachen Beispiel wird die Ereignisschleife jedoch nicht ausgeführt, daher erhalten wir keine aktualisierten Zeitstempel vom X-Server , was wiederum dazu führt, dass QClipboard :: ownesClipboard() false zurückgibt. Setzen Sie die Zwischenablage in Reaktion auf z. Ein Tastatur- oder Mausereignis bewirkt, dass wie erwartet funktioniert.

Der ideale Code Minimum QClipboard :: setText() zu verwenden, sollte etwas wie folgt

#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 
} 

jedoch sein, wie ich sagte, dies wird nicht funktionieren. Durch Versuch und Irrtum habe ich mit dem folgenden kommen, die

#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" 

jedoch arbeiten, ich bin sicher, dass dies weder die minimale noch der beste Weg, es zu tun. Also ich frage, was wird benötigt, um eine solche erforderliche X11 Timestamp Update mit minimalem Aufwand und Auswirkungen zu generieren?

Antwort

0

ich einen Versuch, um so etwas wie geben würde:

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

alle anstehenden Ereignisse etwas, das nicht der Fall sein, wenn Sie nicht nennen app.exec Dies macht eigentlich die Ereignisschleife des Qt Bewerbungsprozess () wie in Ihrem ersten Beispiel und ist sehr ähnlich zu dem, was Sie in Ihrem zweiten tun, wo Sie eigentlich etwas Äquivalentes mit einem Timer stattdessen tun. Ich habe es jedoch nicht ausprobiert und dies ist auch weit weg von dem, was die Dokumentation vorschlägt (behandeln Sie die Zwischenablage als Reaktion auf Benutzereingabeereignisse).

+0

Leider hilft das nicht, da app.processEvents() nur die Ereignisbehandlung von QT auslöst, die davon abhängig ist, dass einige X11-Aktivitäten nicht ausgelöst wurden. Ich habe anfangs "return app.exec()" anstelle von "return 0" im einfachen Beispiel verwendet. – hlovdal

+0

Also muss die Event-Schleife von X11 ausgelöst werden, damit die Zwischenablage funktioniert? Ich kann mir nichts auf der Qt Seite vorstellen. –

+0

Ja, das ist wahrscheinlich eher eine X11 als QT Frage. Die Instanziierung von MainWidget ist offensichtlich genug, aber ich möchte es vermeiden, ein schwereres Dummy-Objekt als nötig zu erstellen, vorzugsweise sollte ich auch möglichst keine Dummy-Objekte erstellen. – hlovdal

0

Ich glaube, Sie haben kein Glück auf X11. Es liegt an der Anwendung selbst, die X11-Zwischenablage zu verwalten. Wenn die Anwendung geschlossen wird, gehen die Daten in der Zwischenablage verloren.

Ich denke, Ihre beste Wette ist, die Befehlszeile xclip Befehl aufzurufen. Verlegen Sie den gewünschten Text in die Zwischenablage. Ich bin nicht sicher, wie verfügbar dieser Befehl normalerweise ist. Und es muss etwas tun, das mit niedrigerem x-Code wiederhergestellt werden könnte?