Как я могу отключить очистку буфера обмена при выходе из приложения 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)

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top