Как работать с "тяжелым" текстом QTextEdit?

Я хочу открыть .docx файл, в котором есть разные виды текста (жирный, курсив, подчеркнутый, разного цвета и т. п.), но после вывода файла в QTextEdit там пусто.

Думаю проблема в виджете, что он не может выводить такой вид.

import docx
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMenuBar, QMenu, QApplication, QFileDialog, QMainWindow, QAction, QMessageBox, QToolBar, QTextEdit


class Main(QMainWindow):

    __doc = None
    __text_edit = None
    __file_path = None
    __is_saved = False
    __is_new = False
    __file_name = None

    def __init__(self):
        super().__init__()

        self.Window()

        self.text_edit()

        self.tool_bar()

        self.menu_bar()

        self.show()

    def text_edit(self):
        self.__text_edit = QTextEdit(self)
        self.setCentralWidget(self.__text_edit)

    def Window(self):
        self.setWindowTitle("Vord")
        self.resize(600, 400)

    def tool_bar(self):
        tool_bar = QToolBar("File", self)

        self.addToolBar(tool_bar)

    def menu_bar(self):
        menu_bar = QMenuBar()
        file = menu_bar.addMenu("Файл")

        new_action = QAction("Новый", self)
        new_action.triggered.connect(self.new)
        new_action.setShortcut('Ctrl+N')
        print(new_action)

        open_action = QAction("Открыть", self)
        open_action.triggered.connect(self.open)
        open_action.setShortcut('Ctrl+O')
        print(open_action)

        exit_action = QAction("Выход", self)
        exit_action.triggered.connect(self.exit)
        exit_action.setShortcut('Alt+F4')
        print(exit_action)

        file.addAction(new_action)
        file.addAction(open_action)
        file.addAction(exit_action)
        self.setMenuBar(menu_bar)


    def open(self):
        fname = QFileDialog.getOpenFileName(self, "Открыть", "G:/Docx", "Документ Microdoft Word(*.docx)")[0]
        self.__file_path = fname
        print(fname)
        try:
            __doc = docx.Document(fname)
            all_paras = __doc.paragraphs
            len(all_paras)
            for para in all_paras:
                self.__text_edit.setText(para.text)
        except FileNotFoundError:
            None


    def new(self):
        print(self.__is_saved)
        if self.__is_saved:
            self.__text_edit.setText("")
            self.__is_new = True
        else:
            self.create_message()


    def exit(self):
        def closeEvent(self, e):
            if self.__is_saved:
                sys.exit(app.exec_())
            else:
                reply = QMessageBox.question(self, "Внимание",
                                             "У вас есть не сохраненные изменения в этом файле. Сохранить изменения?",
                                             QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
                if reply == QMessageBox.No:
                    sys.exit(app.exec_())
                elif reply == QMessageBox.Yes:
                    self.save()
                elif reply == QMessageBox.Cancel:
                    e.ignore()


    def create_message(self):
        message = QMessageBox()
        message.setIcon(QMessageBox.Information)
        message.setWindowTitle("Внимание")
        message.setText("У вас есть не сохраненные изменения в этом файле. Сохранить изменения?")
        message.setStandardButtons(QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
        if message.exec_() == QMessageBox.Yes:
            self.save()
            self.__text_edit.setText("")
        if message.exec() == QMessageBox.No:
            self.__text_edit.setText("")


    def keyPressEvent(self, e):
        k = e.key()
        if k != 16777249:
            self.__is_saved = False


    def closeEvent(self, e):
        if self.__is_saved:
            sys.exit(app.exec_())
        else:
            reply = QMessageBox.question(self, "Внимание",
                                         "У вас есть не сохраненные изменения в этом файле. Сохранить изменения?",
                                         QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
            if reply == QMessageBox.No:
                sys.exit(app.exec_())
            elif reply == QMessageBox.Yes:
                self.save()
            elif reply == QMessageBox.Cancel:
                e.ignore()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    menus = Main()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Как вариант.

import docx
import win32com.client as win32                                           # !!! +++ 

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMenuBar, QMenu, QApplication, \
    QFileDialog, QMainWindow, QAction, QMessageBox, QToolBar, \
    QTextEdit


class Main(QMainWindow):
    __doc = None          # ???
    __text_edit = None    # ???
    __file_path = None    # ???
    __is_saved = False    # ???
    __is_new = False      # ???
    __file_name = None    # ???

    def __init__(self):
        super().__init__()
        self.window()
        self.text_edit()
        self.tool_bar()
        self.menu_bar()
        
    def window(self):
        self.setWindowTitle("Microdoft Word -> QTextEdit")
        self.resize(600, 400)
        
    def text_edit(self):
        self.textEdit = QTextEdit(self)
        self.setCentralWidget(self.textEdit)

    def tool_bar(self):
        tool_bar = QToolBar("File", self)
        self.addToolBar(tool_bar)

    def menu_bar(self):
        menu_bar = QMenuBar()
        file = menu_bar.addMenu("Файл")

        new_action = QAction("Новый", self)
        new_action.triggered.connect(self.new)
        new_action.setShortcut('Ctrl+N')
#        print(new_action)

        open_action = QAction("Открыть", self)
        open_action.triggered.connect(self.open)
        open_action.setShortcut('Ctrl+O')
#        print(open_action)

        exit_action = QAction("Выход", self)
        exit_action.triggered.connect(self.exit)
        exit_action.setShortcut('Alt+F4')
#        print(exit_action)

        file.addAction(new_action)
        file.addAction(open_action)
        file.addAction(exit_action)
        self.setMenuBar(menu_bar)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def open(self):
# ---------->v v
        fname, _ = QFileDialog.getOpenFileName(
            self, 
            "Открыть", 
            ".",                                          # "G:/Docx", установите свое
            "Документ Microdoft Word(*.docx)")
        self.__file_path = fname
        print(fname, _) # +

        if fname.endswith("docx"):
            # Open MS Word
            word = win32.gencache.EnsureDispatch('Word.Application')
            doc = word.Documents.Open(fname)
            # path to  .html
            txt_path = fname.split('.')[0] + '.html'
            
            # wdFormatFilteredHTML has value 10
            # сохраняет документ как html
            doc.SaveAs(txt_path, 10)
            doc.Close()
            
            with open(txt_path, 'r') as f:
                html = f.read()
            
            self.textEdit.setHtml(html)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def new(self):
        print(self.__is_saved)
        if self.__is_saved:
            self.textEdit.setText("")
            self.__is_new = True
        else:
            self.create_message()

    def exit(self):
        def closeEvent(self, e):
            if self.__is_saved:
                sys.exit(app.exec_())
            else:
                reply = QMessageBox.question(
                    self, 
                    "Внимание",
                    "У вас есть не сохраненные изменения в этом файле. Сохранить изменения?",
                    QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel
                )
                if reply == QMessageBox.No:
                    sys.exit(app.exec_())
                elif reply == QMessageBox.Yes:
                    self.save()
                elif reply == QMessageBox.Cancel:
                    e.ignore()

    def create_message(self):
        message = QMessageBox()
        message.setIcon(QMessageBox.Information)
        message.setWindowTitle("Внимание")
        message.setText("У вас есть не сохраненные изменения в этом файле. Сохранить изменения?")
        message.setStandardButtons(QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
        if message.exec_() == QMessageBox.Yes:
            self.save()
            self.textEdit.setText("")
        if message.exec() == QMessageBox.No:
            self.textEdit.setText("")

    def keyPressEvent(self, e):
        k = e.key()
        if k != 16777249:
            self.__is_saved = False

    def closeEvent(self, e):
        if self.__is_saved:
            sys.exit(app.exec_())
        else:
            reply = QMessageBox.question(self, "Внимание",
                                         "У вас есть не сохраненные изменения в этом файле. Сохранить изменения?",
                                         QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
            if reply == QMessageBox.No:
                sys.exit(app.exec_())
            elif reply == QMessageBox.Yes:
                self.save()
            elif reply == QMessageBox.Cancel:
                e.ignore()


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка