У меня есть QtWebEngineWidgets, показывающий некоторые pdf-файлы. Я хочу изменить PDF и принудительно отображать QtWebEngineView автоматически и динамически. Проблема, которую я получаю, заключается в том, что QtWebEngineWidgets не обновляется и не может отображаться при изменении пути к файлу PDF.
class PdfReport(QtWebEngineWidgets.QWebEngineView):
PDFJS = 'file:///pdfjs/web/viewer.html'
def __init__(self, parent=None):
super(PdfReport, self).__init__(parent)
self.PDF = 'file:///Technicalreport/file0.pdf'
self.load(QtCore.QUrl.fromUserInput('%s?file=%s' % (PDFJS, self.PDF)))
@QtCore.pyqtSlot(int)
def index_load(self, _index):
self._index = _index
self.PDF = pdfpath(self._index)
Внешняя функция:
def pdfpath(index):
if index == -1:
PDF = 'file:///Technicalreport/file0.pdf'
else:
PDF = 'file:///Technicalreport/file%d.pdf' %index
return PDF
пытался проверить функцию и возвращает, как и ожидалось:
for i in range(3):
print(pdfpath(i), type(pdfpath(i)))
file:///Technicalreport/file0.pdf <class 'str'>
file:///Technicalreport/file1.pdf <class 'str'>
file:///Technicalreport/file2.pdf <class 'str'>
Да, файлы PDF 'file0', 'file1' и 'file2' существуют:
При запуске выдает такую ошибку:
TypeError: 'module' object is not callable
Обновлять:
import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
PDFJS = 'file:///pdfjs/web/viewer.html'
PDF = 'file:///Technicalreport/file0.pdf'
def pdfpath(index):
if index == -1:
PDF = 'file:///Technicalreport/file0.pdf'
else:
PDF = 'file:///Technicalreport/file%d.pdf' %index
return PDF
class Foo(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Foo, self).__init__(parent)
self.setGeometry(QtCore.QRect(200, 100, 800, 800))
self.pdf = Window()
self.com = Widget()
self.lay = QtWidgets.QVBoxLayout(self)
self.lay.addWidget(self.pdf)
self.lay.addWidget(self.com)
self.com.IndexChanged.connect(self.pdf.index_load)
class Window(QtWebEngineWidgets.QWebEngineView):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.PDF = PDF
self.load(QtCore.QUrl.fromUserInput('%s?file=%s' % (PDFJS, self.PDF)))
@QtCore.pyqtSlot(int)
def index_load(self, _index):
self._index = _index
self.PDF = pdfpath(self._index)
print(self.PDF,'=', self._index)
class Widget(QtWidgets.QWidget):
IndexChanged = QtCore.pyqtSignal(int)
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setLayout(QtWidgets.QVBoxLayout())
self.combo = QtWidgets.QComboBox(self)
self.layout().addWidget(self.combo)
self.combo.addItems(["item1", "item2", "item3"])
self.combo.setMinimumWidth(150)
self.combo.activated[int].connect(self.onActivatedIndex)
@QtCore.pyqtSlot(int)
def onActivatedIndex(self, index):
self.IndexChanged.emit(index)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Foo()
window.setGeometry(600, 50, 800, 600)
window.show()
sys.exit(app.exec_())
Отображать:
Я бы воспроизвел проблему и обновил код
Спасибо за быстрый ответ, но все та же проблема и ошибка. подождите, я воспроизведу код и обновлю.
Смотрите мое обновление..
@попробуй с моим обновлением.






Предполагая, что другие части вашей программы работают правильно, проблема заключается в том, что вы только обновляете переменную, но не загружаете новый URL-адрес, поэтому решение:
class PdfReport(QtWebEngineWidgets.QWebEngineView):
PDFJS = "file:///pdfjs/web/viewer.html"
def __init__(self, parent=None):
super(PdfReport, self).__init__(parent)
self.load_pdf("file:///Technicalreport/file0.pdf")
def load_pdf(self, pdf):
self.load(
QtCore.QUrl.fromUserInput("%s?file=%s" % (PdfReport.PDFJS, pdf))
)
Проблема в вашем случае заключается в том, что вы неправильно создаете путь, потому что вы должны использовать абсолютный путь, а не относительный, как в вашем случае. Учитывая вышеизложенное решение:
import os
import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
PDFJS = QtCore.QUrl.fromLocalFile(
os.path.join(CURRENT_DIR, "pdfjs/web/viewer.html")
).toString()
def pdfpath(index):
filename = ""
if index == -1:
filename = "Technicalreport/file0.pdf"
else:
filename = "Technicalreport/file%d.pdf" % index
return os.path.join(CURRENT_DIR, filename)
class PdfReport(QtWebEngineWidgets.QWebEngineView):
def load_pdf(self, filename):
url = QtCore.QUrl.fromLocalFile(filename).toString()
self.load(QtCore.QUrl.fromUserInput("%s?file=%s" % (PDFJS, url)))
def sizeHint(self):
return QtCore.QSize(640, 480)
@QtCore.pyqtSlot(int)
def index_load(self, index):
path = pdfpath(index)
self.load_pdf(path)
class Widget(QtWidgets.QWidget):
indexChanged = QtCore.pyqtSignal(int)
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.combo = QtWidgets.QComboBox()
self.combo.addItems(["item1", "item2", "item3"])
self.combo.setMinimumWidth(150)
self.combo.activated[int].connect(self.indexChanged)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.combo)
self.setSizePolicy(
QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum
)
class Foo(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Foo, self).__init__(parent)
self.pdf = PdfReport()
self.com = Widget()
self.com.indexChanged.connect(self.pdf.index_load)
self.pdf.index_load(-1)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.pdf)
lay.addWidget(self.com)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Foo()
w.show()
sys.exit(app.exec_())
├── main.py
├── pdfjs
│ ├── build
│ │ └── ...
│ ├── LICENSE
│ └── web
│ ├── ...
│ ├── viewer.html
│ └── ...
└── Technicalreport
├── file0.pdf
├── file1.pdf
└── file2.pdf
Хорошо. Я бы исправил это и предоставил это. Я думал, что этого достаточно с приведенным выше кодом