Как вставить изображение из буфера обмена в документ PyQT5? - PullRequest
0 голосов
/ 13 февраля 2020

Я - пользователь noob PyQt5, следуя учебнику , и я не понимаю, как мне расширить пример кода ниже.

Два обработчика canInsertFromMimeData и insertFromMimeData Методы Qt5 принимают тип данных mime изображения, перетаскиваемый на document (который прекрасно работает). Они оба получают источник параметров сигнала, который получает объект QMimeData.

Однако, если я пытаюсь вставить изображение, скопированное из буфера обмена Windows в документ, оно просто падает, так как для этого нет обработчика.

Поиск Документация Qt5 по адресу https://doc.qt.io/qt-5/qmimedata.html просто приводит меня к еще большей путанице, так как я не программист на C ++ и использую Python 3.x и PyQt5 для этого.

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

    class TextEdit(QTextEdit):

    def canInsertFromMimeData(self, source):

        if source.hasImage():
            return True
        else:
            return super(TextEdit, self).canInsertFromMimeData(source)

    def insertFromMimeData(self, source):

        cursor = self.textCursor()
        document = self.document()

        if source.hasUrls():

            for u in source.urls():
                file_ext = splitext(str(u.toLocalFile()))
                if u.isLocalFile() and file_ext in IMAGE_EXTENSIONS:
                    image = QImage(u.toLocalFile())
                    document.addResource(QTextDocument.ImageResource, u, image)
                    cursor.insertImage(u.toLocalFile())

                else:
                    # If we hit a non-image or non-local URL break the loop and fall out
                    # to the super call & let Qt handle it
                    break

            else:
                # If all were valid images, finish here.
                return


        elif source.hasImage():
            image = source.imageData()
            uuid = hexuuid()
            document.addResource(QTextDocument.ImageResource, uuid, image)
            cursor.insertImage(uuid)
            return

        super(TextEdit, self).insertFromMimeData(source)

код источника: https://www.learnpyqt.com/examples/megasolid-idiom-rich-text-editor/

1 Ответ

0 голосов
/ 16 апреля 2020

Я был точно в том же положении, что и вы. Я также новичок в Python, поэтому могут быть ошибки.

Переменная uuid в document.addResource (QTextDocument.ImageResource, uuid, image) не работает. Это должен быть путь -> QUrl (uuid). Теперь вы можете вставить изображение. Однако, поскольку путь к изображению из буфера обмена меняется, было бы лучше использовать другой путь, например, к каталогу, в котором вы также сохраняете файлы.

Также помните, что пользователь должен выбрать тип файла при сохранении (. html)

Для моего собственного проекта я собираюсь напечатать файл в формате PDF. Таким образом, вам не нужно беспокоиться о путях к изображениям ^ - ^

...