1

私はまだ Python と PyQt の初心者なので、非常に基本的な質問があります。QTextEdit ウィジェット内の親ウィンドウにいくつかのテキストと画像があり、すべてのコンテンツを子ウィンドウの QTextEdit にコピーしようとしています。しかし、何らかの理由で画像をコピーできません。画像ではなくテキストのみがコピーされます。問題を引き起こしているコードのスニペットを次に示します。

self.textEdit.selectAll()
data = self.textEdit.createMimeDataFromSelection()
self.child_window.textEdit.insertFromMimeData(data) # doesn't work with images

実行しようとしている小さなプログラムは次のとおりです。

import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyWindow(QtGui.QWidget):

    def __init__(self,parent=None):
        super(MyWindow,self).__init__(parent)

        self.textEdit = QtGui.QTextEdit(self)
        self.textEdit.setText("Hello World\n")

        self.pushButton = QtGui.QPushButton(self)
        self.pushButton.setText("Copy and paste to Child Window")
        self.pushButton.clicked.connect(self.click_copy_data)

        self.pushButton2 = QtGui.QPushButton(self)
        self.pushButton2.setText("Insert Image")
        self.pushButton2.clicked.connect(self.click_file_dialog)

        self.layoutVertical = QtGui.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.textEdit)
        self.layoutVertical.addWidget(self.pushButton2)
        self.layoutVertical.addWidget(self.pushButton)

        self.setGeometry(150, 150,640, 480)
        self.child_window = CustomWindow(self)
        self.child_window.show()

    def click_copy_data(self):

        self.textEdit.selectAll()
        data = self.textEdit.createMimeDataFromSelection()
        self.child_window.textEdit.insertFromMimeData(data)

    def click_file_dialog(self):
        filePath = QtGui.QFileDialog.getOpenFileName(
            self,
            "Select an image",
            ".",
            "Image Files(*.png *.gif *.jpg *jpeg *.bmp)"
        )

        if not filePath.isEmpty():
            self.insertImage(filePath)


    def insertImage(self,filePath):

        imageUri = QtCore.QUrl(QtCore.QString("file://{0}".format(filePath)))
        image    = QtGui.QImage(QtGui.QImageReader(filePath).read())

        self.textEdit.document().addResource(
            QtGui.QTextDocument.ImageResource,
            imageUri,
            QtCore.QVariant(image)
        )

        imageFormat = QtGui.QTextImageFormat()
        imageFormat.setWidth(image.width())
        imageFormat.setHeight(image.height())
        imageFormat.setName(imageUri.toString())

        textCursor = self.textEdit.textCursor()
        textCursor.movePosition(
            QtGui.QTextCursor.End,
            QtGui.QTextCursor.MoveAnchor
        )
        textCursor.insertImage(imageFormat)

        # This will hide the cursor
        blankCursor = QtGui.QCursor(QtCore.Qt.BlankCursor)
        self.textEdit.setCursor(blankCursor)

class CustomWindow(QtGui.QDialog):
    def __init__(self,parent=None):
        super(CustomWindow,self).__init__(parent)

        self.textEdit = QtGui.QTextEdit(self)

        self.layoutVertical = QtGui.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.textEdit)


if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWindow')
    main = MyWindow()
    main.show()

    sys.exit(app.exec_())

プログラムの仕組みは、メイン ウィンドウ内にテキストを配置してから、画像を挿入するというものです。次に、「コピーして子ウィンドウに貼り付け」ボタンをクリックすると、画像を含むすべてのコンテンツが子に貼り付けられます-しかし、それは想定どおりには機能しません-テキストはコピーされますが、小さなファイルアイコンが表示されます画像があるべき場所。

これについてあなたの助けをいただければ幸いです。

ポール

4

2 に答える 2

1

QTextEditデフォルトでは画像のMIMEタイプをデコードしないため、サポートを追加するためにサブクラス化するだけです。再実装する必要がありcanInsertFromMimeData、代わりにinsertFromMimeData試してみてください。QTextBrowserこれをスクリプトに追加するだけです。

class MyTextBrowser(QtGui.QTextBrowser):
    def __init__(self, parent=None):
        super(MyTextBrowser, self).__init__(parent)

        self.setReadOnly(False)

    def canInsertFromMimeData(self, source):
        if source.hasImage():
            return True

        else:
            return super(MyTextBrowser, self).canInsertFromMimeData(source)

    def insertFromMimeData(self, source):
        if source.hasImage():
            image = QtCore.QVariant(source.imageData())

            document = self.document()
            document.addResource(
                QtGui.QTextDocument.ImageResource,
                QtCore.QUrl("image"),
                image
            )

            cursor = self.textCursor()
            cursor.insertImage("image")

        super(MyTextBrowser, self).insertFromMimeData(source)

そして、両方のウィジェットに変更self.textEdit = QtGui.QTextEdit(self)します。self.textEdit = MyTextBrowser(self)

于 2013-03-24T00:00:14.817 に答える
0

これは、X.Jacobs によって提案されたように、私が使用を終了したソリューションです。

html = parent_textEdit.toHtml()
child_textEdit.setHtml(html)

私は物事をより複雑にしていました。QTextEdit が toHtml() によって生成された html 内の URL として画像が保存されている場所を追跡していることに気付いたとき、それはすべて理にかなっています。

于 2013-03-25T05:11:29.780 に答える