Как на Python сделать так, чтобы при нажатии на строку QTreeView появлялся файл в QtWebEngineWidgets.QWebEngineView?

Рейтинг: 1Ответов: 2Опубликовано: 19.02.2023

У меня есть приложение, в котором слева располагается QTreeView, а справа - QtWebEngineWidgets.QWebEngineView. При нажатии на строку в QTreeView появляется ошибка. Пожалуйста, помогите с вопросом: как сделать так, чтобы по клику в QTreeView документ отображался в QtWebEngineWidgets.QWebEngineView? Раумеется, ошибка в строке self.tree.doubleClicked.connect(self.Open_files), но я не знаю как правильно написать код

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

from PyQt5 import QtCore, QtWidgets
from PyQt5.Qt import (
    QApplication, QWidget, QTreeView,
    QFileSystemModel, QDir)
from PyQt5 import QtWebEngineWidgets
import os


class MyWidget(QWidget):
    global Open_files
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle('Direct tree')

        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.rootPath())

        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(os.getcwd()))
        self.tree.doubleClicked.connect(self.Open_files)
        self.tree.setAnimated(False)
        self.tree.setIndentation(20)
        self.tree.setSortingEnabled(True)

        grid = QtWidgets.QGridLayout()
        grid.setColumnStretch(0, 0)
        self.setLayout(grid)
        grid.addWidget(self.tree, 0, 0)
        grid.addWidget(Open_files(), 0, 1)

    class Open_files(QtWebEngineWidgets.QWebEngineView):
        def __init__(self):
            super().__init__()
            file_name = self.model.filePath(self)
            self.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled, True)
            self.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PdfViewerEnabled, True)
            self.load(QtCore.QUrl.fromUserInput(file_name))


class app:
    app = QApplication([])
    win = MyWidget()
    win.resize(2200, 1200)
    win.show()
    app.exec()

Ответы

▲ 1Принят

Aleksandr Fetisov предложил решение, но функцию open_files правильней изложить вот таким образом (чтобы была визуализация)

def open_files(self, index):
    file_path = self.model.filePath(index)
    
    self.view.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled, True)
    self.view.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PdfViewerEnabled, True)
    self.view.load(QtCore.QUrl.fromUserInput(file_path))
▲ 2

Попробуйте этот код

from PyQt5 import QtCore, QtWidgets
from PyQt5.Qt import (
    QApplication, QWidget, QTreeView,
    QFileSystemModel, QDir)
from PyQt5 import QtWebEngineWidgets
import os


class MyWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle('Direct tree')

        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.rootPath())

        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(os.getcwd()))
        self.tree.doubleClicked.connect(self.open_files)
        self.tree.setAnimated(False)
        self.tree.setIndentation(20)
        self.tree.setSortingEnabled(True)

        self.view = QtWebEngineWidgets.QWebEngineView()
        self.view.setHtml('<html><body><h1>Select a file to view its contents.</h1></body></html>')

        grid = QtWidgets.QGridLayout()
        grid.setColumnStretch(0, 0)
        self.setLayout(grid)
        grid.addWidget(self.tree, 0, 0)
        grid.addWidget(self.view, 0, 1)

    def open_files(self, index):
        file_path = self.model.filePath(index)
        if os.path.isfile(file_path):
            with open(file_path, 'r') as f:
                file_contents = f.read()
            self.view.setHtml(file_contents)