2010-01-05 6 views
6

나는 다음 문제를 드러내는 간단한 PyQt4 응용 프로그램 (아래 코드 참조)이 있습니다. QLineEdit에서 텍스트를 선택하여 클립 보드에 복사하면 응용 프로그램이 실행되는 동안에 만 다른 응용 프로그램에 붙여 넣을 수 있습니다. 종료시 PyQt 응용 프로그램이 클립 보드를 지우므로 응용 프로그램을 닫은 후에 텍스트를 붙여 넣을 수 없습니다.PyQt4 애플리케이션 종료시 어떻게 클립 보드를 지울 수 없습니까?

이 문제를 방지하려면 어떻게해야합니까?

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_() 
+0

1 차 및 2 차 선택은 X에서 종료 할 때 선택된 프로그램 이후에 남아 있지 않습니다. – jfs

답변

5

정상적으로 클립 보드가 발생하지 않습니다. 그냥 QT 그냥 텍스트 대신 클립 보드에 텍스트 포인터를 일종의 저장합니다. 고든 타일러 (Gordon Tyler)는이 토론에 대해 다음과 같이 지적했습니다 : 진행 상황을 설명하는 http://old.nabble.com/Re:-Searching-for-a-very-small-scprit-using-CLIPBOARD-p23246491.html. 나는 코드와 관련 부분을 인용한다.

실행 (closeEvent 핸들러 등) 응용 프로그램의 종료에이 코드 :

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

이 뒤에 기본 개념은 그 기본 복사 클립 보드에 뭔가 들만 복사에 대한 참조/포인터 소스 응용 프로그램 그런 다음 다른 응용 프로그램이 클립 보드에서 데이터 을 붙여 넣으려고하면 소스 응용 프로그램에서 데이터를 요청합니다. OleFlushClipboard을 호출하면 Windows가 실제 데이터 을 참조 대신 클립 보드로 복사합니다. 이로 인해 이미지를 복사 할 때 지연이 발생하더라도 문자열이있는 에 큰 영향을 미치지 않습니다.

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

1

GNU/Linux에서 비슷한 문제가 발생하여 주소가 변경되었지만 여전히 웹 검색을 통해 접근 할 수있는 bialix가 참조한 사이트에서 대답을 찾았을 때이 질문에 마주 쳤습니다. 가장 관련성이 높은 부분을 인용하려면 :

당신이 클립 보드와 같은 것을 가지고 있지 않다면, 클립 보드가 종료 할 때 클립 보드가 비워진다는 것을 기억하십시오.

그래서 그게 있습니다. GNU/Linux의 시스템입니다. ubuntu wiki에 대한 자세한 설명은 다음과 같습니다.

왜 이런 일이 발생합니까?

Xorg는 복사에 보수적 인 접근 방식을 취하기 때문에 문제가 발생합니다. 사용자가 선택 또는 복사를 수행 할 때 원본 데이터에 대한 참조 만 복사합니다. 사용자가 붙여 넣기를 요청할 때까지 소스 프로그램에서 실제 데이터를 검색하지 않습니다. 이 방법으로 불필요한 많은 데이터 전송을 절약 할 수 있습니다. 대신 클립 보드를 저장하지 않은 닫힌 프로그램에서 데이터를 검색 할 방법이 없습니다.

parcellite, klipper, glipper 또는 clipman과 같은 클립 보드 관리자를 설치하여 주변을 둘러 볼 수 있습니다.