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