Pav*_*l.D 2 python pyqt python-3.x pyqt5 qtwebengine
我正在QtWebEngineWidgets展示一些 pdf 文件。我想更改 pdf 并强制QtWebEngineView自动动态显示。我遇到的问题是QtWebEngineWidgetspdf 文件路径更改时无法更新、无法显示。
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)
Run Code Online (Sandbox Code Playgroud)
外部函数:
def pdfpath(index):
if index == -1:
PDF = 'file:///Technicalreport/file0.pdf'
else:
PDF = 'file:///Technicalreport/file%d.pdf' %index
return PDF
Run Code Online (Sandbox Code Playgroud)
尝试测试函数并按预期返回:
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'>
Run Code Online (Sandbox Code Playgroud)
是的 pdf 文件'file0','file1'并且'file2'存在:
运行时出现此错误:
TypeError: 'module' object is not callable
Run Code Online (Sandbox Code Playgroud)
更新:
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_())
Run Code Online (Sandbox Code Playgroud)
展示:
假设程序的其他部分工作正常,问题是您只更新了变量,但没有加载新的 url,因此解决方案是:
\n\nclass PdfReport(QtWebEngineWidgets.QWebEngineView):\n PDFJS = "file:///pdfjs/web/viewer.html"\n\n def __init__(self, parent=None):\n super(PdfReport, self).__init__(parent)\n self.load_pdf("file:///Technicalreport/file0.pdf")\n\n def load_pdf(self, pdf):\n self.load(\n QtCore.QUrl.fromUserInput("%s?file=%s" % (PdfReport.PDFJS, pdf))\n )\nRun Code Online (Sandbox Code Playgroud)\n\n您的情况的问题是您错误地创建了路径,因为您必须使用绝对路径,而不是像您的情况那样使用相对路径。考虑到上述情况,解决方案是:
\n\nimport os\nimport sys\nfrom PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets\n\nCURRENT_DIR = os.path.dirname(os.path.realpath(__file__))\n\nPDFJS = QtCore.QUrl.fromLocalFile(\n os.path.join(CURRENT_DIR, "pdfjs/web/viewer.html")\n).toString()\n\n\ndef pdfpath(index):\n filename = ""\n if index == -1:\n filename = "Technicalreport/file0.pdf"\n else:\n filename = "Technicalreport/file%d.pdf" % index\n return os.path.join(CURRENT_DIR, filename)\n\n\nclass PdfReport(QtWebEngineWidgets.QWebEngineView):\n def load_pdf(self, filename):\n url = QtCore.QUrl.fromLocalFile(filename).toString()\n self.load(QtCore.QUrl.fromUserInput("%s?file=%s" % (PDFJS, url)))\n\n def sizeHint(self):\n return QtCore.QSize(640, 480)\n\n @QtCore.pyqtSlot(int)\n def index_load(self, index):\n path = pdfpath(index)\n self.load_pdf(path)\n\n\nclass Widget(QtWidgets.QWidget):\n indexChanged = QtCore.pyqtSignal(int)\n\n def __init__(self, parent=None):\n super(Widget, self).__init__(parent)\n self.combo = QtWidgets.QComboBox()\n self.combo.addItems(["item1", "item2", "item3"])\n self.combo.setMinimumWidth(150)\n self.combo.activated[int].connect(self.indexChanged)\n\n lay = QtWidgets.QVBoxLayout(self)\n lay.addWidget(self.combo)\n\n self.setSizePolicy(\n QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum\n )\n\n\nclass Foo(QtWidgets.QWidget):\n def __init__(self, parent=None):\n super(Foo, self).__init__(parent)\n\n self.pdf = PdfReport()\n self.com = Widget()\n\n self.com.indexChanged.connect(self.pdf.index_load)\n self.pdf.index_load(-1)\n\n lay = QtWidgets.QVBoxLayout(self)\n lay.addWidget(self.pdf)\n lay.addWidget(self.com)\n\n\nif __name__ == "__main__":\n\n app = QtWidgets.QApplication(sys.argv)\n w = Foo()\n w.show()\n sys.exit(app.exec_())\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pdfjs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LICENSE\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 web\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 viewer.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Technicalreport\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file0.pdf\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file1.pdf\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file2.pdf\nRun Code Online (Sandbox Code Playgroud)\n