PYQT 응용 프로그램 종료시 클립 보드를 비활성화하려면 어떻게해야합니까?

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

  •  18-09-2019
  •  | 
  •  

문제

문제를 드러내는 간단한 pyqt4 응용 프로그램 (아래 코드 참조)이 있습니다. QLineEdit 그리고 클립 보드에 복사 한 다음 응용 프로그램이 실행중인 경우에만 다른 응용 프로그램에 붙여 넣을 수 있습니다. 종료시, PYQT 응용 프로그램은 클립 보드를 지우므로 응용 프로그램이 닫힌 후 텍스트를 붙여 넣을 수 없습니다.

이 문제를 피하기 위해 무엇을 할 수 있습니까?

pyqt 4.4.3 @ python 2.5 @ windows xp. 또한이 효과는 PYQT 4.5+ 및 Linux에서도 확인되었습니다.

import sys
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
edit = QtGui.QLineEdit()
edit.setText('foo bar')
edit.show()
app.exec_()
도움이 되었습니까?

해결책

좋아, 클립 보드가 정확히 밝혀지지 않습니다. QT는 텍스트 대신 클립 보드에 텍스트의 일종의 포인터를 저장합니다. 고든 타일러가 나를 지적했다 PYQT 메일 링리스트에 대한이 논의 무슨 일이 일어나고 있는지 설명합니다. 나는 코드와 설명의 관련 부분을 인용합니다.

응용 프로그램 종료 시이 코드를 실행하십시오 (예 : CloseEvent 핸들러에서) :

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

이것의 기본 개념은 기본적으로 클립 보드에 무언가를 복사하면 소스 응용 프로그램에 대한 참조/포인터 만 복사한다는 것입니다. 그런 다음 다른 응용 프로그램이 클립 보드에서 데이터를 붙여 넣으려면 소스 응용 프로그램에서 데이터를 요청합니다. 부름 올레 플러시 클립 보드 Windows가 실제 데이터를 참조 대신 클립 보드에 복사하게합니다. 이미지를 복사 할 때 지연이 발생하지만 문자열에 눈에 띄는 영향을 미치지 않아야합니다.

위의 코드는 꽤 크로스 플랫폼이며 Linux 플랫폼에 큰 영향을 미치지 않습니다.

다른 팁

GNU/Linux에서 비슷한 문제를 겪었을 때이 질문을 우연히 발견하고 Bialix가 참조한 사이트에서 답을 찾았습니다 (주소가 변경되었지만 웹 검색을 통해 여전히 도달 할 수 있음). 가장 관련성이 높은 부분을 인용하려면 :

Linux에서는 Klipper와 같은 것이 없으면 앱이 클립 보드를 종료 할 때 클립 보드가 비워집니다.

그래서 그게 있습니다. GNU/Linux의 시스템입니다. 다음은 더 철저한 설명입니다 우분투 위키:

왜 이런 일이 발생합니까?

Xorg는 보수적 인 복사 접근 방식을 취하기 때문에 문제가 발생합니다. 사용자가 선택 또는 복사를 수행 할 때 원본 데이터에 대한 참조 만 복사합니다. 사용자가 페이스트를 요청할 때까지 소스 프로그램에서 실제 데이터를 검색하지 않습니다. 클립 보드를 다른 곳에 저장하지 않은 폐쇄 된 프로그램에서 데이터를 검색 할 수있는 방법이없는 비용 으로이 방식으로 데이터를 필요로하는 많은 양도를 절약 할 수 있습니다.

Parcellite, Klipper, Glipper 또는 Clipman과 같은 클립 보드 관리자를 설치하여이를 해결할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top