Как отключить очистку буфера обмена при выходе из приложения PyQt? - PullRequest
7 голосов
/ 05 января 2010

У меня есть простое приложение 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_()

Ответы [ 2 ]

5 голосов
/ 06 января 2010

ОК, не совсем очищен буфер обмена. Просто QT хранит какой-то указатель текста в буфере обмена, а не просто текст. Гордон Тайлер указал мне на это обсуждение в списке рассылки PyQt , которое объясняет, что происходит. Я цитирую код и соответствующую часть объяснения.

Запустите этот код при выходе из приложения (например, в обработчике closeEvent):

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

Основная идея заключается в том, что по умолчанию что-то копируется в буфер обмена копирует только ссылку / указатель на источник приложение. Затем, когда другое приложение хочет вставить данные из буфера обмена он запрашивает данные из исходного приложения. Вызов OleFlushClipboard заставляет Windows копировать реальные данные в буфер обмена вместо ссылки. Хотя это вызывает задержка при копировании изображений, она не должна оказывать заметного влияния со строками.

Приведенный выше код является довольно кроссплатформенным и не оказывает вредного влияния на платформу Linux.

2 голосов
/ 24 мая 2015

Я наткнулся на этот вопрос, когда столкнулся с подобной проблемой в GNU / Linux и нашел ответ на сайте, на который ссылается bialix (чей адрес изменился, но все еще доступен через веб-поиск). Чтобы процитировать наиболее значимую часть:

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

Итак, вот что. Это системная вещь для GNU / Linux. Вот более подробное объяснение из Ubuntu Wiki :

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...