2010-01-05 2 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

ПЕРВИЧНЫЕ и ВТОРИЧНЫЕ выборы не выживают после того, как программы были выбраны при выходе на X. – jfs

ответ

5

ОК, там не совсем ясно, что происходит с буфером обмена. Просто QT хранит какой-то указатель текста в буфере обмена, а не только текст. Гордон Тайлер указал мне на эту дискуссию: 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 (адрес которого изменился, но все еще может быть достигнут через веб-поиск). Чтобы привести наиболее релевантную часть:

Помните, что в Linux, если у вас есть что-то вроде klipper, когда приложение, устанавливающее буфер обмена, завершается, буфер обмена пуст.

Так что есть. Это системная вещь для GNU/Linux. Вот более подробное объяснение от ubuntu wiki:

Почему это происходит?

Проблема возникает из-за того, что Xorg придерживается консервативного подхода к копированию. Он копирует только ссылку на исходные данные, когда пользователь выполняет выбор или копирование. Он не идет и не извлекает фактические данные из исходной программы, пока пользователь не попросит вставить. Это избавляет от ненужной передачи данных таким образом, за счет отсутствия способа получения данных из закрытой программы, которая еще не сохранила буфер обмена.

Вы можете обойти это, установив менеджера буфера обмена, например, parcellite, klipper, glipper или clipman.

Смежные вопросы