Comment puis-je désactiver clairement presse-papiers à la sortie de l'application PyQt?

StackOverflow https://stackoverflow.com/questions/2007103

  •  18-09-2019
  •  | 
  •  

Question

J'ai une simple application de PyQt4 (voir le code ci-dessous) qui révèle un problème: si je sélectionne le texte à partir d'un QLineEdit et le copier dans le presse-papiers, je peux le coller à une autre application que pendant que ma demande est en cours d'exécution. Il semble que la sortie, l'application PyQt efface le presse-papiers, donc je ne peux pas coller le texte après l'application est fermée.

Que puis-je faire pour éviter ce problème?

PyQt 4.4.3 @ Python 2.5 @ Windows XP. Aussi cet effet confirmé sur PyQt 4.5+, et sous Linux aussi.

import sys
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
edit = QtGui.QLineEdit()
edit.setText('foo bar')
edit.show()
app.exec_()
Était-ce utile?

La solution

OK, il n'y a pas tout à fait claire de se presse-papiers. Juste magasin QT une sorte de pointeur de texte dans le presse-papiers et non du texte. Gordon Tyler m'a signalé cette discussion sur la liste de diffusion PyQt qui explique ce qui se passe. Je cite le code et une partie pertinente d'explication.

Exécuter ce code à la sortie de l'application (par exemple dans le gestionnaire closeEvent):

   from PyQt4 import QtGui, QtCore
   clipboard = QtGui.QApplication.clipboard()
   event = QtCore.QEvent(QtCore.QEvent.Clipboard)
   QtGui.QApplication.sendEvent(clipboard, event)
  

Le concept de base derrière cela est que par la copie par défaut quelque chose   dans le presse-papiers que des copies d'une référence / pointeur à la source   application. Puis, quand une autre application veut coller les données   du presse-papiers, il demande les données de l'application source.   Appel OleFlushClipboard provoque Windows pour copier les données réelles   dans le presse-papiers au lieu de la référence. Bien que cela provoque un   retard lors de la copie des images, il ne devrait pas avoir d'impact notable   avec des chaînes.

Le code ci-dessus est assez multiplateforme et ne fait pas de mauvais impact sur la plate-forme Linux.

Autres conseils

Je suis tombé sur cette question quand je suis tombé problème similaire sous GNU / Linux et trouvé la réponse sur le site référencé par bialix (dont l'adresse a changé, mais peut encore être atteint via la recherche Web). Pour citer la partie la plus pertinente:

  

Rappelez-vous que sous Linux, sauf si vous avez quelque chose comme Klipper, lorsque l'application définissant les sorties du presse-papiers, le presse-papiers se vide.

Alors il y a cela. Il est une chose de système pour GNU / Linux. Voici une explication plus approfondie de ubuntu wiki :

  

Pourquoi cela?

     

Le problème se produit parce que Xorg adopte une approche prudente à la copie. Il copie seulement une référence aux données d'origine lorsque l'utilisateur effectue une sélection ou une copie. Il ne va pas et récupérer les données réelles du programme source jusqu'à ce que l'utilisateur demande une pâte. Il permet d'économiser beaucoup de transfert de données inutiles de cette façon, au détriment d'avoir aucun moyen de récupérer les données d'un programme fermé qui n'a pas sauvé son presse-papier quelque part ailleurs.

Vous pouvez contourner en installant un gestionnaire de presse-papiers, comme parcellite, Klipper, glipper ou clipman.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top