Re: Issues with QMimeData.text()

Vincent Vande Vyvre <[email protected]> Sat, 13 Jun 2020 09:11:30 +0200
Newsgroups gmane.comp.python.pyqt-pykde
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------44653749D738EEAA2CBEABDD
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Le 13/06/20 à 02:39, Bryce Beagle a écrit :
> Hi,
>
> I'm trying to implement drag-and-drop behavior in my widget and I'm
> having issues with the QMimeData that is provided in the QDropEvent. 
>
> When dragging text from some applications (e.g. PyCharm),
> event.mimeData().text() always returns an empty string. If I manually
> use event.mimeData().data('text/plain'), I get my text just fine,
> albeit as a bytes object. 
>
> The Qt documentation for QMimeData::text() says that it "Returns a
> plain text (MIME type text/plain) representation of the data.", so I
> feel that if the 'text/plain' format is defined, this should work
> fine. For reference, dragging from PyCharm, event.mimeData().formats
> returns:
>
> ['text/plain', 'text/plain;charset=UTF-16',
> 'text/plain;charset=UTF-8', 'text/plain;charset=UTF-16BE',
> 'text/plain;charset=UTF-16LE', 'text/plain;charset=ISO-8859-1',
> 'text/plain;charset=US-ASCII', 'text/plain;charset=unicode']
>
> Here's an MCVE using PyQt 5.15.0
>
> from PyQt5.QtGui import QDragEnterEvent, QDragMoveEvent, QDropEvent
> from PyQt5.QtWidgets import QApplication, QTextEdit
>
>
> class DragTextEdit(QTextEdit):
>
>     def dragEnterEvent(self, event: QDragEnterEvent):
>         event.acceptProposedAction()
>
>     def dragMoveEvent(self, event: QDragMoveEvent):
>         event.acceptProposedAction()
>
>     def dropEvent(self, event: QDropEvent):
>         data = event.mimeData()
>         print("data.text():", data.text())  # Empty string
>         print("data.data('text/plain'):", data.data('text/plain'))  #
> bytes
>
>
> app = QApplication([])
> text_edit = DragTextEdit()
> text_edit.show()
> app.exec_()

Hi,

I've changed your code:

    def dropEvent(self, event: QDropEvent):
        data = event.mimeData()
        print("data.text():", data.text(), type(data.text()))
        print("data.data('text/plain'):", str(data.data('text/plain')),
               type(data.data('text/plain')))

And the result:

data.text(): Déjà-vu <class 'str'>
data.data('text/plain'): b'D\xc3\xa9j\xc3\xa0-vu' <class
'PyQt5.QtCore.QByteArray'>

On Ubuntu Mate, the text "Déjà-vu" is dragged from Pluma (old Gedit)

Vincent


--------------44653749D738EEAA2CBEABDD
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Le 13/06/20 à 02:39, Bryce Beagle a
      écrit :<br>
    </div>
    <blockquote type="cite"
cite="mid:CAKKt4mZQ5rEGVQyt4z4=6U1j2OnzjmcCmjsaSwixxsi5Mh1q-g@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">Hi,
        <div><br>
        </div>
        <div>I'm trying to implement drag-and-drop behavior in my widget
          and I'm having issues with the QMimeData that is provided in
          the QDropEvent. </div>
        <div><br>
        </div>
        <div>When dragging text from some applications (e.g. PyCharm),
          event.mimeData().text() always returns an empty string. If I
          manually use event.mimeData().data('text/plain'), I get my
          text just fine, albeit as a bytes object. </div>
        <div><br>
        </div>
        <div>The Qt documentation for QMimeData::text() says that it
          "Returns a plain text (MIME type text/plain) representation of
          the data.", so I feel that if the 'text/plain' format is
          defined, this should work fine. For reference, dragging from
          PyCharm, event.mimeData().formats returns:</div>
        <div><br>
        </div>
        <div>['text/plain', 'text/plain;charset=UTF-16',
          'text/plain;charset=UTF-8', 'text/plain;charset=UTF-16BE',
          'text/plain;charset=UTF-16LE',
          'text/plain;charset=ISO-8859-1',
          'text/plain;charset=US-ASCII', 'text/plain;charset=unicode']<br>
        </div>
        <div><br>
        </div>
        <div>Here's an MCVE using PyQt 5.15.0</div>
        <div><br>
        </div>
        <div><font face="monospace">from PyQt5.QtGui import
            QDragEnterEvent, QDragMoveEvent, QDropEvent<br>
            from PyQt5.QtWidgets import QApplication, QTextEdit<br>
            <br>
            <br>
            class DragTextEdit(QTextEdit):<br>
            <br>
                def dragEnterEvent(self, event: QDragEnterEvent):<br>
                    event.acceptProposedAction()<br>
            <br>
                def dragMoveEvent(self, event: QDragMoveEvent):<br>
                    event.acceptProposedAction()<br>
            <br>
                def dropEvent(self, event: QDropEvent):<br>
                    data = event.mimeData()<br>
                    print("data.text():", data.text())  # Empty string<br>
                    print("data.data('text/plain'):",
            data.data('text/plain'))  # bytes<br>
            <br>
            <br>
            app = QApplication([])<br>
            text_edit = DragTextEdit()<br>
            text_edit.show()<br>
            app.exec_()</font><br>
        </div>
      </div>
    </blockquote>
    <p>Hi,</p>
    <p>I've changed your code: <br>
    </p>
    <p>    def dropEvent(self, event: QDropEvent):<br>
              data = event.mimeData()<br>
              print("data.text():", data.text(), type(data.text()))<br>
              print("data.data('text/plain'):",
      str(data.data('text/plain')),<br>
                     type(data.data('text/plain')))<br>
    </p>
    <p>And the result:</p>
    data.text(): Déjà-vu &lt;class 'str'&gt;<br>
    data.data('text/plain'): b'D\xc3\xa9j\xc3\xa0-vu' &lt;class
    'PyQt5.QtCore.QByteArray'&gt;<br>
    <p>On Ubuntu Mate, the text "Déjà-vu" is dragged from Pluma (old
      Gedit)</p>
    <p>Vincent<br>
    </p>
  </body>
</html>

--------------44653749D738EEAA2CBEABDD--