代码之家  ›  专栏  ›  技术社区  ›  bialix

如何在Pyqt4应用程序退出时禁用清除剪贴板?

  •  7
  • bialix  · 技术社区  · 15 年前

    我有一个简单的pyqt4应用程序(见下面的代码),它揭示了下一个问题:如果我从qlineedit中选择文本并将其复制到剪贴板,那么我只能在应用程序运行时将其粘贴到另一个应用程序。似乎在退出Pyqt应用程序时会清除剪贴板,这样在应用程序关闭后就无法粘贴文本。

    我该怎么做才能避免这个问题?

    pyqt 4.4.3@python 2.5@windows xp.而且,这种影响在Pyqt4.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 回复  |  直到 9 年前
        1
  •  5
  •   bialix    15 年前

    好的,没有完全清除剪贴板。只是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平台造成任何不良影响。

        2
  •  1
  •   rr-    9 年前

    当我在GNU/Linux下遇到类似的问题时,我偶然发现了这个问题,并在Bialix引用的站点上找到了答案(其地址已更改,但仍然可以通过Web搜索找到)。引用最相关的部分:

    记住,在Linux中,除非有类似Klipper的东西,否则当设置剪贴板的应用程序退出时,剪贴板将清空。

    就是这样。这是GNU/Linux的系统问题。这里有一个更详尽的解释 ubuntu wiki :

    为什么会这样?

    问题的发生是因为Xorg采用了保守的复制方法。当用户执行选择或复制时,它只复制对原始数据的引用。在用户请求粘贴之前,它不会从源程序中获取实际数据。它以这种方式保存了大量不必要的数据传输,代价是无法从没有保存剪贴板的关闭程序中检索数据。

    你可以通过安装一个剪贴板管理器来绕过它,比如parcellite、klipper、glipper或clipman。