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

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

person bialix    schedule 05.01.2010    source источник
comment
ПЕРВИЧНЫЙ и ВТОРИЧНЫЙ выборы не сохраняются после программ, которые они выбрали при выходе на X.   -  person jfs    schedule 05.01.2010


Ответы (2)


ОК, там не совсем ясно из буфера обмена происходит. Просто 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.

person bialix    schedule 06.01.2010
comment
Это не будет работать на других платформах, если нет доступного менеджера буфера обмена. - person ekhumoro; 21.03.2019

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

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

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

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

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

Вы можете обойти это, установив менеджер буфера обмена, такой как парцеллит, клиппер, глиппер или клипман.

person rr-    schedule 24.05.2015