[英]How to resize the QWebEnginePage inside the window in PyQt5?
有人可以告訴我如何調整這個 QWebEnginePage 的大小。 當我運行這個文件時,它會打開一個像網站一樣的完整瀏覽器窗口,但我想調整它的大小以在窗口中添加一個按鈕和其他元素。
這是我的代碼:
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets, QtWebChannel, QtGui
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QSizeGrip, QGridLayout
from jinja2 import Template
#import D_scraper
class Form(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
# self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
# for making the window draggable
self.oPos = self.pos()
self.setFixedSize(1000, 650)
testlw = QVBoxLayout()
testlo = QGridLayout()
testlo.addLayout(testlw, 0, 1)
self.setLayout(testlo)
self.setWindowTitle('test')
self.setStyleSheet('background-color: rgb(255,255,0);')
self.setStyleSheet('border-radius: 30px')
class Element(QtCore.QObject):
def __init__(self, name, parent=None):
super(Element, self).__init__(parent)
self._name = name
@property
def name(self):
return self._name
def script(self):
return ""
class WebEnginePage(QtWebEngineWidgets.QWebEnginePage):
def __init__(self, parent=None):
super(WebEnginePage, self).__init__(parent)
self.loadFinished.connect(self.onLoadFinished)
self._objects = []
self._scripts = []
def add_object(self, obj):
self._objects.append(obj)
@QtCore.pyqtSlot(bool)
def onLoadFinished(self, ok):
print("Finished loading: ", ok)
if ok:
self.load_qwebchannel()
self.add_objects()
def load_qwebchannel(self):
file = QtCore.QFile(":/qtwebchannel/qwebchannel.js")
if file.open(QtCore.QIODevice.ReadOnly):
content = file.readAll()
file.close()
self.runJavaScript(content.data().decode())
if self.webChannel() is None:
channel = QtWebChannel.QWebChannel(self)
self.setWebChannel(channel)
def add_objects(self):
if self.webChannel() is not None:
objects = {obj.name: obj for obj in self._objects}
self.webChannel().registerObjects(objects)
_script = """
{% for obj in objects %}
var {{obj}};
{% endfor %}
new QWebChannel(qt.webChannelTransport, function (channel) {
{% for obj in objects %}
{{obj}} = channel.objects.{{obj}};
{% endfor %}
});
"""
self.runJavaScript(Template(_script).render(objects=objects.keys()))
for obj in self._objects:
if isinstance(obj, Element):
self.runJavaScript(obj.script())
class Helper(Element):
classClicked = QtCore.pyqtSignal(str)
def script(self):
js = """
document.addEventListener('click', function(e) {
e = e || window.event;
var target = e.target || e.srcElement;
e.preventDefault()
{{name}}.objectClicked(target.className);
}, false);"""
return Template(js).render(name=self.name)
@QtCore.pyqtSlot(str)
def objectClicked(self, className):
if className:
self.classClicked.emit(className)
def on_clicked(name):
on_clicked.xcv = name
print(on_clicked.xcv)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = Form()
classname_helper = Helper("classname_helper")
classname_helper.classClicked.connect(on_clicked)
view = QtWebEngineWidgets.QWebEngineView()
page = WebEnginePage()
page.add_object(classname_helper)
view.setPage(page)
view.load(QtCore.QUrl("https://www.flipkart.com/search?q=mobiles&as=on&as-show=on&otracker=AS_Query_TrendingAutoSuggest_1_0_na_na_na&otracker1=AS_Query_TrendingAutoSuggest_1_0_na_na_na&as-pos=1&as-type=TRENDING&suggestionId=mobiles&requestId=4720716a-cf2f-4822-9036-c66b9542d2d6"))
view.show()
sys.exit(app.exec_())
我是 QT 框架的新手,所以遇到了這個問題。 您能否在窗口內添加一個按鈕以及調整大小的瀏覽器作為示例,以便我理解。
您需要創建一個“容器”小部件,並將視圖嵌入其中。
您已經完成了一半,因為您已經創建了一個小部件,您只需正確設置該小部件的布局,並向其中添加子小部件。
class Form(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
self.setWindowTitle('test')
self.setMinimumSize(320, 240)
self.resize(640, 480)
testlo = QGridLayout()
self.setLayout(testlo)
self.testButton = QtWidgets.QPushButton('test button')
testlo.addWidget(self.testButton)
self.testLabel = QtWidgets.QLabel('test label')
# add a label in the first row of the grid, second column
testlo.addWidget(self.testLabel, 0, 1)
self.view = QtWebEngineWidgets.QWebEngineView()
# add the view to the second row, but let it occupy two columns
testlo.addWidget(self.view, 1, 0, 1, 2)
classname_helper = Helper("classname_helper")
classname_helper.classClicked.connect(on_clicked)
self.page = WebEnginePage()
self.page.add_object(classname_helper)
self.view.setPage(self.page)
self.view.load(QtCore.QUrl("https://www.flipkart.com/search?q=mobiles&as=on&as-show=on&otracker=AS_Query_TrendingAutoSuggest_1_0_na_na_na&otracker1=AS_Query_TrendingAutoSuggest_1_0_na_na_na&as-pos=1&as-type=TRENDING&suggestionId=mobiles&requestId=4720716a-cf2f-4822-9036-c66b9542d2d6"))
# if you call setStyleSheet() multiple times, it always overwrites the
# previously set stylesheet, just use it once with the full contents
self.setStyleSheet('''
background-color: rgb(255,255,0);
border-radius: 30px;
''')
# ...
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = Form()
window.show()
sys.exit(app.exec_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.