2012-04-07 8 views
1

Ich habe eine bereits existierende Funktion, die einen Rich Text/HTML-Bericht generiert. Meine App zeigt diesen Bericht in einem Tooltip an. Ich habe die Möglichkeit hinzugefügt, diesen Bericht in die Zwischenablage zu kopieren, so etwas wie der folgenden Code:Wie kann ich mit QClipboard Rich Text kopieren und für Texteditoren auf Nur-Text herunterstufen?

reportRichText = generateReport() 
    clipboard = QApplication.clipboard() 
    reportRichTextMime = QMimeData() 
    reportRichTextMime.setHtml(reportRichText) 
    clipboard.setMimeData(reportRichTextMime) 

Dies ermöglicht es mir, den Bericht zu kopieren und in etwas einfügen, die Rich Text akzeptiert. Zum Beispiel kann ich den Bericht in MS Word einfügen. Das Problem kann ich jedoch nicht in einen Texteditor einfügen. Ich habe einfach eine ausgegraute "Paste" -Auswahl, als ob nichts hinzuzufügen wäre. Ein weiterer interessanter Leckerbissen, wenn ich "Paste Special" mit MS Word mache, habe ich nur die Möglichkeit, als "HTML-Format" einzufügen, es wird keine Klartext-Option aufgelistet.

Natürlich, wenn ich QClipboard einfach als Nur-Text zu kopieren, kann ich kopieren und einfügen, wo immer ich will. Allerdings kopiere ich alle Markups. Was ich offensichtlich nicht will. Ich möchte entweder Rich Text oder nicht markierten Text.

Das Verhalten, das ich erwarten würde, ist das Verhalten, das Sie erhalten, wenn Sie Text von einem Webbrowser kopieren/einfügen. Bei Anwendungen, die Rich Text akzeptieren, wird Rich Text eingefügt (außerdem können Sie in MS Word als Text oder Rich Text einfügen). Bei Klartext-Editoren wird der nicht gerenderte Klartext in den Klartext-Editor eingefügt.

Wie kann ich mit QClipboard Rich-Text verwenden, der auch als reiner Text eingefügt werden kann?

Antwort

1

Ich bin nicht sehr vertraut mit Qt noch nicht, aber von einigen googeln sieht es aus wie Sie benötigen QMimeData Unterklasse und Ihre eigenen html() und text() Methoden schreiben, die HTML und Text-Versionen der Daten zurück, zusammen mit einer Methode, die formats() gibt text/html und text/plain als die Typen zurück, die in dem Objekt unterstützt werden. Dann lege das in die Zwischenablage.

1

Nun, ich bin mir ziemlich sicher, der richtige Weg, dies zu tun ist, sowohl setText und setHtml auf dem QMimeData zu rufen. Vom QT docs for QMimeData:

Ein einzelnes QMimeData Objekt speichern kann, die gleichen Daten mehrere verschiedene Formate zur gleichen Zeit

IE verwenden, wenn Sie tun:

reportRichText = generateReport() 
clipboard = QApplication.clipboard() 
reportRichTextMime = QMimeData() 
reportRichTextMime.setHtml(reportRichText) 
reportRichTextMime.setText("hello!") 
clipboard.setMimeData(reportRichTextMime) 

dann erhalten Sie:

 
hello! 

eingefügt in Editoren, die Klartext und meine annehmen hübscher Bericht in den Herausgebern, die rtf Text annehmen. Dies ist weil "Hallo!" ist die Klartextdarstellung der Daten, während mein Bericht die HTML-Darstellung ist.

Für meinen Bericht habe ich mich entschieden zurückzugehen und einen Weg zu finden, den Bericht sowohl in HTML als auch im Klartext zu erstellen, was nicht so störend oder schwierig war wie ich dachte. Also in der Tat, was ich jetzt habe, ist:

reportRichText = generateReport(rtf=True) 
reportPlainText = generateReport(rtf=False) 
clipboard = QApplication.clipboard() 
reportRichTextMime = QMimeData() 
reportRichTextMime.setHtml(reportRichText) 
reportRichTextMime.setText(reportPlainText) 
clipboard.setMimeData(reportRichTextMime) 

und dies scheint den Trick

+0

Gut zu wissen zu tun. Aus dem Lesen der Dokumente * klang * wie 'setText()' den Typ des Clips auf reinen Text und 'setHtml()' setze ihn auf HTML, d. H., Dass du nicht beide verwenden kannst. – kindall