Pergunta

Eu tenho um aplicativo PyQt4 simples (veja o código abaixo) que revela um problema: se eu selecionar o texto de um QLineEdit e copiá-lo para a área de transferência, então eu posso colá-lo em outro aplicativo somente enquanto meu aplicativo está sendo executado. Parece que na saída, aplicativo PyQt limpa a área de transferência, então não posso colar o texto após o aplicativo é fechado.

O que posso fazer para evitar este problema?

PyQt 4.4.3 @ Python 2.5 @ Windows XP. Também este efeito confirmado em PyQt 4.5+ e no Linux também.

import sys
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
edit = QtGui.QLineEdit()
edit.setText('foo bar')
edit.show()
app.exec_()
Foi útil?

Solução

OK, não é exatamente clara de área de transferência ocorre. Apenas QT armazenar algum tipo de ponteiro de texto na área de transferência em vez de apenas texto. Gordon Tyler tem apontou-me a essa discussão na lista de discussão PyQt que explica o que está acontecendo. Eu código de cotação e parte relevante da explicação.

Executar este código na saída de aplicação (por exemplo, em CloseEvent manipulador):

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

O conceito básico por trás disso é que, por padrão copiando algo na área de transferência apenas cópias uma referência / ponteiro para a fonte inscrição. Então, quando outro aplicativo quer colar os dados da área de transferência que solicita os dados do aplicativo de origem. Chamando OleFlushClipboard faz com que Windows para copiar os dados reais na área de transferência, em vez do referência. Enquanto isso faz com que um atraso quando copiar imagens, não deve ter nenhum impacto perceptível com cordas.

O código acima é muito multi-plataforma e não fazem qualquer impacto negativo sobre a plataforma Linux.

Outras dicas

me deparei com esta questão quando me encontrei com problema semelhante no GNU / Linux e encontrou a resposta no site referenciado por bialix (cujo endereço mudou, mas ainda pode ser alcançado através de pesquisa na web). Para citar a parte mais relevante:

Lembre-se que no Linux, a menos que tenha algo como klipper, quando a configuração das saídas da área de transferência aplicativo, os esvazia área de transferência.

Portanto, não é isso. É uma coisa sistema para GNU / Linux. Aqui está uma explicação mais completa de ubuntu wiki :

Por que isso acontece?

O problema acontece porque Xorg tem uma abordagem conservadora para copiar. Ele copia apenas uma referência para os dados originais quando executa o usuário seleciona uma ou cópia. Ele não vai e recuperar os dados reais do programa de código até que o usuário solicita uma pasta. Ele salva um monte de transferência desnecessária de dados desta forma, à custa de não ter nenhuma maneira de recuperar dados de um programa fechado que não salvou a sua área de transferência para outro lugar.

Você pode obter em torno dele através da instalação de um gerente da prancheta, como parcellite, klipper, glipper ou clipman.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top