2013-03-23 1 views
1

저는 여전히 파이썬과 PyQt의 초보자입니다. 정말 기본적인 질문이 있습니다. QTextEdit 위젯 내부에 부모 윈도우에 텍스트와 이미지가 있고 자식 윈도우의 QTextEdit에 모든 내용을 복사하려고합니다. 그러나 어떤 이유로 이미지를 복사 할 수 없으며 텍스트 만 이미지가 아닌 복사됩니다. 다음은 나에게 문제를주고 코드의 조각이다 :QMimeData를 다른 윈도우의 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_()) 

방법은 당신이 내부의 텍스트를 가지고있다 주 창을 누른 다음 이미지를 삽입합니다. 그런 다음 "하위 창에 복사하여 붙여 넣기"버튼을 클릭하면 이미지를 포함하여 모든 내용이 하위에 붙여 넣어 져야합니다.하지만 그 방법으로는 작동하지 않습니다. 텍스트는 복사되지만 작은 파일 아이콘이 나타납니다. 이미지가 있어야합니다.

감사합니다.

답변

1

QTextEdit 그래서 그냥 지원을 추가 할 서브 클래스, 기본적으로 이미지 MIME 형식을 디코딩하지 않습니다, 당신은 또한, canInsertFromMimeDatainsertFromMimeData 다시 구현하는 대신 QTextBrowser을 시도해야합니다. 두 위젯에 self.textEdit = MyTextBrowser(self)self.textEdit = QtGui.QTextEdit(self)

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) 

을 변경 : 그냥 스크립트에 이것을 추가합니다.

+0

이것은 이상합니다. 어떤 이유로 source.hasImage()는 True를 반환하지 않습니다. .jpg 또는 .png 파일을 사용해도. – Paul

+0

이것은 내가 시도한 것이다 : print "has image?", data.hasImage(). 나는 틀렸다. – Paul

+1

그 이유는 html MIME 타입이 사용되고 있기 때문입니다.'mimedata = textEdit.toHtml()'및'textEdit.setHtml (mimedata)' –

0

이것은 내가 X.Jacobs가 제안한대로 사용을 끝낸 해결책입니다.

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

나는 더 복잡한 작업을하고있었습니다. QTextEdit가 toHtml()에 의해 생성 된 HTML 내부에 URL로 이미지가 저장되는 위치를 추적한다는 것을 깨달았을 때 모두 의미가있었습니다.

관련 문제