Как на Python сделать так, чтобы при нажатии на строку QTreeView появлялся файл в QtWebEngineWidgets.QWebEngineView?
У меня есть приложение, в котором слева располагается 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()
Ответы (2 шт):
Автор решения: Aleksandr Fetisov
→ Ссылка
Попробуйте этот код
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)
Автор решения: Олег Паламарчук
→ Ссылка
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))
