class Viewer: def __init__(self, molecule_file=None): self.molecule_file = molecule_file self.view = QWebEngineView() self.view.setPage(WebEnginePage(self.view)) self.view.loadFinished.connect(self.on_load_finish) self.html_path = os.path.abspath( os.path.join(os.path.dirname(__file__), "view.html")) self.local_url = QUrl.fromLocalFile(self.html_path) self.view.load(self.local_url) def on_load_finish(self, ok): if ok and self.molecule_file is not None: file = os.path.abspath(self.molecule_file) self.load_molecule(file) def ready(self, return_value): print(return_value) def change_view(self, representation): print(representation) self.view.page().runJavaScript(f'ChangeView("{representation}")', self.ready) def load_molecule(self, file): self.view.page().runJavaScript(f'moleculeLoader("{file}")', self.ready)
class BokehTab(QWidget): def __init__(self, nameTab, script, div, time, trace, path): super().__init__() self.vbox = QVBoxLayout() self.hBox = QVBoxLayout() self.__info_data_label = QLabel( "File: {0}; Time: {1}; Trace: {2}; Path: {3}".format(nameTab, time, trace, path)) self.browser = QWebEngineView() self.dev = QWebEngineView() self.script = script self.div = div self.name = nameTab self.hBox.addWidget(self.browser, stretch=75) self.hBox.addWidget(self.dev, stretch=20) self.hBox.addWidget(self.__info_data_label, stretch=5) # self.hBox.addWidget(self.test, stretch=20) self.vbox.addLayout(self.hBox) self.controls() self.setLayout(self.vbox) def controls(self): with open(os.path.join("temp", "template.html"), "r")as f: template = f.read() t = Template(template) content = t.substitute(bokeh_script=str(self.script), bokeh_div=str(self.div)) with open("{}.html".format(os.path.join("temp", self.name)), "w") as f: f.write(content) self.browser.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.JavascriptEnabled, True) self.browser.load(QUrl('file:///{}.html'.format("temp/" + self.name))) # TODO проверить на linux self.browser.page().setDevToolsPage(self.dev.page()) def __controls_test(self): self.browser.page().runJavaScript("""$("div:contains('Wiggle')").click()""")
class MarkdownPreview(QDockWidget): def __init__(self, file, text): super().__init__() self.file = file self.text = text self.setWindowTitle('Markdown Preview') self.markdown_extras = ['tables', 'fenced-code-blocks', 'task-list'] text.textChanged.connect(self.on_update) self.text.verticalScrollBar().valueChanged.connect(self.sync_scroll) self.web = QWebEngineView() self.web.setHtml(markdown2.markdown(self.text.toPlainText(), extras=self.markdown_extras), baseUrl=QUrl.fromLocalFile(file)) self.web.loadFinished.connect(self.sync_scroll) self.setWidget(self.web) def sync_scroll(self): self.web.page().runJavaScript( f'scrollTo({self.text.horizontalScrollBar().value()}, document.body.scrollHeight * {self.text.verticalScrollBar().value()} / {self.text.verticalScrollBar().maximum()});' ) def on_update(self): self.web.page().setHtml(markdown2.markdown( self.text.toPlainText(), extras=self.markdown_extras), baseUrl=QUrl.fromLocalFile(self.file))
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.view = QWebEngineView() self.view.loadFinished.connect(self._on_load_finished) with open( '../QWebEngine__append_custom_javascript__jQuery/js/jquery-3.1.1.min.js' ) as f: self.jquery_text = f.read() self.jquery_text += "\nvar qt = { 'jQuery': jQuery.noConflict(true) };" tool_bar = self.addToolBar('General') action = tool_bar.addAction('Change <a> background-color') action.triggered.connect(self._change_background_color) self.setCentralWidget(self.view) def _on_load_finished(self, ok: bool): self.view.page().runJavaScript(self.jquery_text) def _change_background_color(self): color = QColorDialog.getColor(Qt.yellow) if not color.isValid(): return code = "qt.jQuery('a').css('background-color', '{}');".format( color.name()) self.view.page().runJavaScript(code)
def main(): if not 'visits.db' in os.listdir(): db.create_all() if PyQt_on: thread = threading.Thread(target=run_flask_app) thread.daemon = True thread.start() while not url_ok("127.0.0.1", 5000): sleep(0.1) qt_app = QApplication([]) qt_app.setWindowIcon(QtGui.QIcon("brain.ico")) qt_app.setApplicationName("Рассеянный склероз: тесты/опросники") w = QWebEngineView() #w = QWebView() w.load(QUrl('http://127.0.0.1:5000')) w.page().profile().downloadRequested.connect(_downloadRequested) w.show() qt_app.exec_() else: url = 'http://localhost:5005/' webbrowser.open_new_tab(url) app.run(debug=True, port=5005)
class PyqtCallJS(QWidget): def __init__(self): super(PyqtCallJS, self).__init__() self.setWindowTitle('打开外部网页例子') self.setGeometry(5, 30, 1355, 730) self.initUI() def initUI(self): self.browser = QWebEngineView() url = os.getcwd() + '/tt.html' self.browser.load(QUrl.fromLocalFile(url)) self.layout = QVBoxLayout() self.setLayout(self.layout) self.layout.addWidget(self.browser) button = QPushButton('设置全名') button.clicked.connect(self.complete_fullname) self.layout.addWidget(button) def complete_fullname(self): self.value = 'hello world' self.browser.page().runJavaScript('fullname("' + self.value + '");', self.js_callback) def js_callback(self, result): print(result)
def __init__(self): super().__init__() self.setGeometry(0, 0, 1024, 768) #self.setStyleSheet("background:black") chart = QWebEngineView(self) chart.page().setBackgroundColor(Qt.red) #button = QPushButton("Test",self) #button.resize(50, 50) #self.col = QColor(0, 0, 0) chart.resize(self.size()) chart.setAutoFillBackground(True) """ button.setAutoFillBackground(True) pa = QPalette() #br = pa.dark() pa.setColor(QPalette.Window, Qt.red) pa.setColor(QPalette.WindowText, Qt.red) button.setPalette(pa) button.setAutoFillBackground(True) """ self.center() self.show()
class SC(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.view = QWebEngineView(self) self.channel = QWebChannel() self.handler = CallHandler() self.channel.registerObject('pyjs', self.handler) self.view.page().setWebChannel(self.channel) self.handler._signal1.connect(self.handler._slot1) #self.handler._signal2.connect(self.handler._slot2) b1 = QPushButton("b1", self) b1.clicked.connect(self.s1s) #b2 = QPushButton("b2", self) #b2.clicked.connect(self.s2s) url_string = "file:///test.html" self.view.load(QUrl(url_string)) self.setGeometry(300, 300, 300, 220) self.show() def s1s(self): self.handler._signal1.emit("b1") def s2s(self): self.handler._signal2.emit("b2")
class WebPopupWindow(QWidget): def __init__(self, profile): super().__init__() self._view = QWebEngineView(self) super().setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose) super().setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) layout = QVBoxLayout() super().setLayout(layout) layout.addWidget(self._view) self._view.setPage(QWebEnginePage(profile, self._view)) self._view.titleChanged.connect(super().setWindowTitle) self._view.page().geometryChangeRequested.connect( self.handleGeometryChangeRequested ) self._view.page().windowCloseRequested.connect(super().close) def view(self): return self._view @pyqtSlot("const QRect") def handleGeometryChangeRequested(self, newGeometry): self._view.setMinimumSize(newGeometry.width(), newGeometry.height()) super().move(newGeometry.topLeft() - self._view.pos()) super().resize(0, 0) super().show()
class MapWindow(QDialog): rectSignal = pyqtSignal(str) def __init__(self, parent=None): super(MapWindow, self).__init__(parent) self.label = QLabel(self) self.setWindowTitle(APP_NAME) self.resize(QSize(1400, 900)) layout = QVBoxLayout(self) self.webview = QWebEngineView(self) self.channel = QWebChannel(self) # 把自身对象传递进去 self.channel.registerObject('Bridge', self) # 设置交互接口 self.webview.page().setWebChannel(self.channel) layout.addWidget(self.webview) self.webview.load( QUrl.fromLocalFile(APP_HtmlPath + os.sep + "choose_rect.html")) self.show() @pyqtSlot(str) @pyqtSlot(QUrl) def getRect(self, rect): leftbottom = rect.split(' ')[0] righttop = rect.split(' ')[1] self.rectSignal.emit(rect) # 发射信号 self.close()
class FormWidget(QWidget): def __init__(self, parent): super(FormWidget, self).__init__(parent) self.__controls() self.__layout() def __controls(self): html = open(f"{data_dir}/test.html", 'r').read() self.browser = QWebEngineView() self.browser.setPage(WebEnginePage(self.browser)) self.browser.setHtml(html) self.browser.loadFinished.connect(self.onLoadFinished) def onLoadFinished(self, ok): if ok: self.browser.page().runJavaScript("helloWorld(1, \"12\")", self.ready) def __layout(self): self.vbox = QVBoxLayout() self.hBox = QVBoxLayout() self.hBox.addWidget(self.browser) self.vbox.addLayout(self.hBox) self.setLayout(self.vbox) def ready(self, returnValue): print(returnValue)
class Dialog(QDialog): def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_Dialog() self.ui.setupUi(self) self.m_view = QWebEngineView(self) self.channel = QWebChannel(self) self.b = bridge(self) self.channel.registerObject('b', self.b) self.m_view.page().setWebChannel(self.channel) self.m_view.page().load( QUrl("file:///" + QFileInfo("index.html").absoluteFilePath())) self.ui.viewLayout.addWidget(self.m_view) # js_str = '''window.bridge.showMsgBox()''' js_str = '''alert('from runJavaScript')''' self.ui.pbAlert.clicked.connect( lambda: self.m_view.page().runJavaScript(js_str, self.callback)) # self.ui.pbAlert.clicked.connect(lambda: self.b.sendText.emit()) # self.ui.pbGetWebWidth.clicked.connect(lambda: self.b.sendText.emit()) # self.b.sendText.connect(lambda: print('b.sendText.emit():')) # self.b.signal_1.connect(lambda: print('b.signal_1.emit():')) def __del__(self): del self.ui def callback(self, v): print('callback:', v)
class WebEngineView(QMainWindow): def __init__(self): super(WebEngineView, self).__init__() self.setWindowTitle('显示本地网页') self.setWindowIcon(QIcon(QPixmap('../images/python.png'))) self.resize(1500, 700) self.unit_ui() def unit_ui(self): self.browser = QWebEngineView() # 得到当前文件目录 由于Qurl不识别相对路径 url = os.getcwd() # print(url) self.browser.load(QUrl.fromLocalFile(url + '/测试.html')) self.layout().addWidget(self.browser) # button调用js button = QPushButton('改变颜色') self.layout().addWidget(button) button.move(800, 50) button.clicked.connect(self.get_div) # 调用js def get_div(self): self.browser.page().runJavaScript('get_p()', self.callback) # js回调 @staticmethod def callback(result): print(result)
class MainWindow(QWebEnginePage): # noinspection PyUnresolvedReferences def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 设置窗口标题 # self.setWindowTitle('My Browser') # 设置窗口图标 # self.setWindowIcon(QIcon('icons/penguin.png')) # 设置窗口大小900*600 # self.resize(900, 600) # self.show() # 2 self.view = QWebEngineView() channel = QWebChannel() handler = CallHandler() channel.registerObject('handler', handler) self.view.page().setWebChannel(channel) self.view.loadFinished.connect(self._loadFinish) # 添加浏览器到窗口中 # self.setCentralWidget(self.view) # htmlUrl = 'file:////Users/play/github/Python_Master_Courses/GUI图形界面/pyqt5/pyqt5-javascript-互相传值/js1.html' self.view.load(QUrl(htmlUrl)) self.view.show() # 3 def _loadFinish(self, *args, **kwargs): # self.view.page().runJavaScript("window.show()") self.view.page().runJavaScript("call_python()") print("qt load finish view.loadFinished.connect(self._loadFinish)")
class MainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.m_view = QWebEngineView() self.setCentralWidget(self.m_view) page = self.m_view.page() page.featurePermissionRequested.connect( self.on_featurePermissionRequested) page.load(QUrl("https://maps.google.com")) @pyqtSlot(QUrl, QWebEnginePage.Feature) def on_featurePermissionRequested(self, securityOrigin, feature): if feature != QWebEnginePage.Geolocation: return mgsbox = QMessageBox(self) mgsbox.setAttribute(Qt.WA_DeleteOnClose) mgsbox.setText( self.tr("%s wants to know your location" % (securityOrigin.host(), ))) mgsbox.setInformativeText( self.tr( "Do you want to send your current location to this website?")) mgsbox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) mgsbox.setDefaultButton(QMessageBox.Yes) page = self.m_view.page() if mgsbox.exec_() == QMessageBox.Yes: page.setFeaturePermission(securityOrigin, feature, QWebEnginePage.PermissionGrantedByUser) else: page.setFeaturePermission(securityOrigin, feature, QWebEnginePage.PermissionDeniedByUser)
class BookView(QSplitter): def __init__(self, parent=None): super(BookView, self).__init__(parent=parent) self.create_layout() self.create_connections() def create_layout(self): self.web_view = QWebEngineView() self.chapter_list = QListWidget() self.next_button = QPushButton("Next chapter") self.previous_button = QPushButton("Previous chapter") hbox = QHBoxLayout() hbox.addStretch() hbox.addWidget(self.previous_button) hbox.addWidget(self.next_button) vbox = QVBoxLayout() vbox.addWidget(QLabel("Chapters")) vbox.addWidget(self.chapter_list) vbox.addLayout(hbox) widget = QWidget() widget.setLayout(vbox) self.web_view.setUrl(QtCore.QUrl("http://")) self.webPage = self.web_view.page() self.addWidget(self.web_view) self.addWidget(widget) def create_connections(self): chlist = self.chapter_list self.next_button.clicked.connect(lambda: chlist.setCurrentRow(0 if chlist.currentRow() == chlist.count() - 1 else chlist.currentRow() + 1)) self.previous_button.clicked.connect(lambda: chlist.setCurrentRow(chlist.count() - 1 if chlist.currentRow() == 0 else chlist.currentRow() - 1)) self.chapter_list.currentRowChanged[int].connect(self.set_chapter) def set_chapter(self, num=None): if num is None: num = self.chapter_list.currentRow() if num < 0: num = len(self.book.chapters) - 1 elif num >= len(self.book.chapters): num = 0 self.web_view.setHtml(self.book.get_chapter(num).decode(encoding="utf-8")) self.webPage = self.web_view.page() self.webPage.setZoomFactor(2) def load_book(self, book_id): self.book = Book(book_id) self.chapter_list.clear() for chapter in self.book.chapters: self.chapter_list.addItem(chapter[0]) self.chapter_list.setCurrentRow(0)
class Window(BaseWindow): def __init__(self): self.debug = 1 self.app = QApplication(sys.argv) self.desktop = QApplication.desktop() self.web = QWebEngineView() self.icon = QIcon(ICON) #self.web.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.web.titleChanged.connect(self.title_changed) self.web.iconUrlChanged.connect(self.icon_changed) self.web.page().windowCloseRequested.connect(self.close_window) self.web.page().geometryChangeRequested.connect(self.set_geometry) def show(self, window_state): if window_state == "maximized" and not self.web.isMaximized(): self.web.showNormal() self.web.showMaximized() elif window_state == "fullscreen" and not self.web.isFullScreen(): self.web.showNormal() self.web.showFullScreen() elif window_state == "normal": self.web.showNormal() else: self.web.show() def run(self): return self.app.exec_() def set_debug(self, debuglevel): self.debug = debuglevel def set_geometry(self, geom): self.web.setGeometry(geom) def close_window(self): sys.exit() def icon_changed(self): if not self.icon.isNull(): self.web.setWindowIcon(self.icon) def title_changed(self, title): self.web.setWindowTitle(title) def load_url(self, url): self.url = QUrl.fromEncoded(url) self.web.setUrl(self.url) def set_size(self, width, height): if width <= 0: width = 640 if height <= 0: height = 480 left = (self.desktop.width() - width) / 2 top = (self.desktop.height() - height) / 2 self.web.setGeometry(left, top, width, height)
class PrintXiaoWei(QWidget): def __init__(self, base_path): super(PrintXiaoWei, self).__init__() self.filename = base_path + "案件信息.xlsx" self.base_path = base_path self.resize(800, 600) style_str = "QLabel{font-size: 30px;}" + "QLineEdit{font-size: 30px;}" + \ "QPushButton{font-size: 25px; background-color: green; min-height: 35px}" + \ "QComboBox{font-size: 30px;}" + "QCheckBox{font-size: 30px;}" + \ "QHeaderView{font-size: 25px;} QTableWidget{font-size: 25px;}" + \ "QDateTimeEdit{font-size: 30px;} QMessageBox{font-size: 30px;}" self.setStyleSheet(style_str) wb = openpyxl.load_workbook(self.filename) self.browser = QWebEngineView() self.browser.settings().setAttribute( QWebEngineSettings.AllowRunningInsecureContent, True) url = "C:/html_tmp/xiaowei.html" self.browser.load(QUrl(url)) layout = QGridLayout() yan_data = get_yan_info(wb) row_index = 0 for i in range(math.ceil(len(yan_data) / 16)): print_xbtz = PrintBtn(index=i, name="先保通知单%d" % (i + 1)) print_xbtz.clicked.connect(self.print_xbtz) layout.addWidget(print_xbtz, row_index, 0) row_index += 1 for i in range(math.ceil(len(yan_data) / 10)): print_ky = PrintBtn(index=i, name="现场勘验笔录%d" % (i + 1)) print_ky.clicked.connect(self.print_ky) layout.addWidget(print_ky, row_index, 0) row_index += 1 self.btn_print_fm = QPushButton("打印封面") self.btn_print_fm.clicked.connect(self.print_fm) layout.addWidget(self.btn_print_fm, row_index + 1, 0) self.btn_back = QPushButton("修改数据") layout.addWidget(self.btn_back, row_index + 2, 0) self.btn_next = QPushButton("下一步") layout.addWidget(self.btn_next, row_index + 3, 0) layout.addWidget(self.browser, row_index + 4, 0) self.setLayout(layout) def print_xbtz(self): sender = self.sender() self.browser.page().runJavaScript("print_xianbaotz%d();" % sender.index) def print_ky(self): sender = self.sender() filename = self.base_path + "小微勘验%d.docx" % sender.index os.system('ksolaunch %s' % filename) def print_fm(self): filename = self.base_path + "封面.docx" os.system('ksolaunch %s' % filename)
class Window(BaseWindow): def __init__(self): self.debug=1 self.app = QApplication(sys.argv) self.desktop= QApplication.desktop() self.web = QWebEngineView() self.icon = QIcon(ICON) #self.web.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.web.titleChanged.connect(self.title_changed) self.web.iconUrlChanged.connect(self.icon_changed) self.web.page().windowCloseRequested.connect(self.close_window) self.web.page().geometryChangeRequested.connect(self.set_geometry) def show(self,window_state): if window_state == "maximized" and not self.web.isMaximized(): self.web.showNormal() self.web.showMaximized() elif window_state == "fullscreen" and not self.web.isFullScreen(): self.web.showNormal() self.web.showFullScreen() elif window_state == "normal": self.web.showNormal() else: self.web.show() def run(self): return self.app.exec_() def set_debug(self, debuglevel): self.debug=debuglevel def set_geometry(self,geom ): self.web.setGeometry(geom) def close_window(self): sys.exit() def icon_changed(self): if not self.icon.isNull(): self.web.setWindowIcon(self.icon) def title_changed(self, title): self.web.setWindowTitle(title) def load_url(self,url): self.url=QUrl.fromEncoded(url) self.web.setUrl(self.url) def set_size(self,width, height): if width<=0: width=640 if height<=0: height=480 left=(self.desktop.width()-width)/2 top=(self.desktop.height()-height)/2 self.web.setGeometry(left,top,width,height)
class Web2PyQt5(QWidget, Ui_Form): """ Class documentation goes here. """ def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(Web2PyQt5, self).__init__(parent) self.setupUi(self) self.initUi() def initUi(self): self.splitter.setStretchFactor(0, 1) self.splitter.setStretchFactor(1, 7) self.setWindowFlags(Qt.WindowCloseButtonHint) vLayout = QVBoxLayout() vLayout.setContentsMargins(0, 0, -1, -1) url = QUrl(QFileInfo("./webchannel.html").absoluteFilePath()) self.view = QWebEngineView(self.widget) vLayout.addWidget(self.view) self.widget.setLayout(vLayout) self.view.load(url) @pyqtSlot() def on_pb_submit_clicked(self): """ Slot documentation goes here. """ if self.lineEdit_username.text() == "": QMessageBox.warning(self, "警告", "用户名没有输入") self.lineEdit_username.setFocus() elif self.lineEdit_pwd.text() == "": QMessageBox.warning(self, "警告", "密码没有输入") self.lineEdit_pwd.setFocus() else: name = self.lineEdit_username.text() pwd = self.lineEdit_pwd.text() jscode = "PyQt52WebValue('{}','{}');".format(name, pwd) self.view.page().runJavaScript(jscode) @pyqtSlot() def on_pb_reset_clicked(self): """ PyQt5的输入栏内容清空 """ self.lineEdit_username.setText("") self.lineEdit_pwd.setText("") def setLineEdit(self, list): self.lineEdit_username.setText(list[0]) self.lineEdit_pwd.setText(list[1]) def __del__(self): self.view.deleteLater()
class BrowserWidget(QtWidgets.QWidget): def __init__(self): """ Create main window with browser and a button """ super(BrowserWidget, self).__init__() self.layout = QtWidgets.QHBoxLayout() self.setLayout(self.layout) self.webview = QWebView() self.layout.addWidget(self.webview) self.webview.urlChanged.connect(self.url_changed) self.set_form_handler(self._default_form_handler) #self.default_url = "https://dokit.met.no/fou/kl/prosjekter/eemep/esnap_userdoc" #self.tb_url.setText(self.default_url) #self.browse() def browse(self): """browse an url""" url = self.tb_url.text() if self.tb_url.text() else self.default_url self.webview.setPage(QWebPage()) self.webview.load(QtCore.QUrl(url)) self.webview.show() def url_changed(self, url): """ Triggered when the url is changed """ def set_html(self, text: str): """ set html string""" self.web_page = StartWebPage() self.webview.setPage(self.web_page) self.webview.page().formSubmitted.connect(self._handle_formSubmitted) self.webview.setHtml(text) @staticmethod def _default_form_handler(dict): for key, value in dict: print(str.format("{0} => {1}", key, value)) def set_form_handler(self, handler): """ the form handler should accept a dictionary with query results as input """ self.form_handler = handler def evaluate_javaScript(self, jscript): self.webview.page().mainFrame().evaluateJavaScript(jscript) def _handle_formSubmitted(self, url): # I don't manage to get the right query strings from the web-page print("handleFromSubmitted:" + url.toString()) self.form_handler( QtCore.QUrlQuery(url).queryItems(QtCore.QUrl.FullyDecoded))
class ChartWidget(QWidget): """ 图形显示控件 """ save_option_signal = pyqtSignal(str) def __init__(self, *args, **kwargs): super(ChartWidget, self).__init__(*args, *kwargs) main_layout = QVBoxLayout() main_layout.setContentsMargins(QMargins(0, 0, 0, 0)) self.chart_container = QWebEngineView(self) self.chart_container.load(QUrl("file:///html/charts/custom_chart.html")) # 加载页面 # 设置与页面信息交互的通道 channel_qt_obj = QWebChannel(self.chart_container.page()) # 实例化qt信道对象,必须传入页面参数 self.contact_channel = ChartOptionChannel() # 页面信息交互通道 self.chart_container.page().setWebChannel(channel_qt_obj) channel_qt_obj.registerObject("pageContactChannel", self.contact_channel) # 信道对象注册信道,只能注册一个 main_layout.addWidget(self.chart_container) other_layout = QHBoxLayout() self.decipherment_edit = QLineEdit(self) self.decipherment_edit.setPlaceholderText("此处填写对图形的文字解读(非必填)") other_layout.addWidget(self.decipherment_edit) self.private_check = QCheckBox(self) self.private_check.setText("仅自己可见") other_layout.addWidget(self.private_check) save_button = QPushButton("保存图形", self) save_menu = QMenu(save_button) chart_action = save_menu.addAction("普通图形") setattr(chart_action, "chart_type", "normal") chart_action.triggered.connect(self.save_chart_option) season_action = save_menu.addAction("季节图形") setattr(season_action, "chart_type", "season") season_action.triggered.connect(self.save_chart_option) save_button.setMenu(save_menu) other_layout.addWidget(save_button) main_layout.addLayout(other_layout) self.setLayout(main_layout) def save_chart_option(self): """ 保存当前的图形配置 """ action = self.sender() normal = getattr(action, "chart_type") self.save_option_signal.emit(normal) def show_chart(self, chart_type, option, values, headers): """ 显示图形 option:(json字符串)基础的图形配置, values:(json字符串)用于绘图的数据 """ self.contact_channel.chartSource.emit(chart_type, option, values, headers)
class PyFactorialDemo(QWidget): def __init__(self): super(PyFactorialDemo, self).__init__() self.setWindowTitle("PyFactorialDemo") self.resize(500, 500) self.layout = QVBoxLayout() self.setLayout(self.layout) self.browser = QWebEngineView() self.browser.load(QUrl.fromLocalFile(os.getcwd() + './t3.html')) self.layout.addWidget(self.browser) channel.registerObject("obj", factorial) self.browser.page().setWebChannel(channel)
class window(QWidget): def __init__(self): super().__init__() self.setup() def setup(self): self.flag = False self.box = QVBoxLayout(self) # 创建一个垂直布局来放控件'' #添加收货地址页面,运行页面js #人工校验地址成功后,进入商品页面 self.btn_a = QPushButton('淘宝') self.btn_a.clicked.connect(self.to_a) self.btn_b = QPushButton('百度') self.btn_b.clicked.connect(self.to_b) self.btn_get = QPushButton('get') self.btn_get.setVisible(False) self.btn_get.clicked.connect(self.get) self.btn_start = QPushButton('启动') self.btn_start.clicked.connect(self.start) self.web = QWebEngineView() # 创建浏览器组件对象 self.web.resize(1200, 900) # 设置大小 self.web.load(QUrl("https://www.baidu.com")) # 打开页面 self.box.addWidget(self.btn_a) self.box.addWidget(self.btn_b) self.box.addWidget(self.btn_get) self.box.addWidget(self.btn_start) self.box.addWidget(self.web) # 再放浏览器 self.web.show() # 最后让页面显示出来 self.setWindowTitle("贝贝拍单工具") #进入商品购买页面 def to_a(self): self.web.load(QUrl("http://www.taobao.com")) #self.btn_get.click() def to_b(self): self.web.load(QUrl("http://www.baidu.com")) #self.btn_get.click() def get(self): self.web.page().toHtml(self.sku_html) def start(self): if self.flag: self.flag = False else: self.flag = True #将sku页面信息的内容赋值给窗体对象 def sku_html(self, html): if html.find("www.baidu.com") != -1: print("www.baidu.com") else: print("www.taobao.com")
def run(p='.'): app = QApplication(sys.argv) view = QWebEngineView() channel = QWebChannel() handler = monkey.op() channel.registerObject('pyjs', handler) view.page().setWebChannel(channel) url_string = p + "/lib/pages/index.html" view.load(QUrl(url_string)) view.resize(1366, 880) view.show() sys.exit(app.exec_())
def initBrowser(self): view = QWebEngineView() channel = QWebChannel() handler = CallHandler(self) channel.registerObject('pyjs', handler) view.page().setWebChannel(channel) url_string = "https://bing.com" view.load(QUrl(url_string)) view.show() self.view = view self.channel = channel self.handler = handler
class Example(QWidget): def __init__(self): super().__init__() self.resize(640, 320) self.setWindowTitle('PyQt-5 WebEngine') page = "https://www.google.com" self.url = QLineEdit(page) self.url.setPlaceholderText(page) self.go = QPushButton("Ir") self.go.clicked.connect(self.btnIrClicked) self.nav_bar = QHBoxLayout() self.nav_bar.addWidget(self.url) self.nav_bar.addWidget(self.go) self.progress = QProgressBar() self.progress.setValue(0) html = """ <!DOCTYPE HTML> <html> <head> <title>Example Local HTML</title> </head> <body> <p>Este es un archivo <code>HTML</code> local.</p> <p>Si deseas acceder página indica su <code>URL</code> y presiona <b>Ir</b></p> </body> </html> """ self.web_view = QWebEngineView() self.web_view.loadProgress.connect(self.webLoading) self.web_view.setHtml(html) root = QVBoxLayout() root.addLayout(self.nav_bar) root.addWidget(self.web_view) root.addWidget(self.progress) self.setLayout(root) def btnIrClicked(self, event): url = QUrl(self.url.text()) self.web_view.page().load(url) def webLoading(self, event): self.progress.setValue(event)
class PyChrome(QWidget): def __init__(self): super().__init__() self.resize(640, 320) self.setWindowTitle('PyQt-5 WebEngine') page = "https://www.google.com" self.url = QLineEdit(page) self.url.setPlaceholderText(page) self.go = QPushButton("Ir") self.go.clicked.connect(self.btnIrClicked) self.nav_bar = QHBoxLayout() self.nav_bar.addWidget(self.url) self.nav_bar.addWidget(self.go) self.progress = QProgressBar() self.progress.setValue(0) html = """ <!DOCTYPE HTML> <html> <head> <title>Example Local HTML</title> </head> <body> <p>Este es un archivo <code>HTML</code> local.</p> <p>Si deseas acceder página indica su <code>URL</code> y presiona <b>Ir</b></p> </body> </html> """ self.web_view = QWebEngineView() self.web_view.loadProgress.connect(self.webLoading) self.web_view.setHtml(html) root = QVBoxLayout() root.addLayout(self.nav_bar) root.addWidget(self.web_view) root.addWidget(self.progress) self.setLayout(root) def btnIrClicked(self, event): url = QUrl(self.url.text()) self.web_view.page().load(url) def webLoading(self, event): self.progress.setValue(event)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('Javascript call PyQt5') self.setGeometry(5, 30, 1355, 730) self.browser = QWebEngineView() # 加载外部的web界面 url = QUrl(QFileInfo("./web_file1.html").absoluteFilePath()) self.browser.load(url) self.setCentralWidget(self.browser) def calljs(self): jscode = "PyQt52WebValue('你好web');" self.browser.page().runJavaScript(jscode)
class Example(QMainWindow): htmlPath = QDir.current() htmlPath.cd("html") def __init__(self): super().__init__() self.setObjectName('Main') QMetaObject.connectSlotsByName(self) self.view = QWebEngineView() self.view.settings().setAttribute(QWebEngineSettings.LocalStorageEnabled, True) self.view.setObjectName('MapWidget') self.window = QWidget() self.window.setObjectName('MainWidget') self.layout = QGridLayout(self.window) self.layout.addWidget(self.view) self.setCentralWidget(self.window) self.channel = QWebChannel(self.view.page()) self.view.page().setWebChannel(self.channel) self.channel.registerObject("jshelper", self) principal = Figure() js = JavascriptLink(QUrl.fromLocalFile(self.htmlPath.absoluteFilePath("qwebchannel.js")).toString()) principal.header.add_child(Element(js.render())) map = folium.Map(location=[36, -108], zoom_start=5, tiles='StamenWatercolor').add_to(principal) fastestRoute = folium.PolyLine(((40, -110), (50, -110)), weight=5, color='blue').add_to(map) f = Figure() f.html.add_child(Element('<button id="myBtn">Try it</button>')) f.html.add_child(Element('<p>\n TEST \n</p>')) link = JavascriptLink(QUrl.fromLocalFile(self.htmlPath.absoluteFilePath("popup.js")).toString()) f.html.add_child(Element(link.render())) iframe = branca.element.IFrame(html=f.render(), width=500, height=300) popup = folium.Popup(iframe, max_width=500) fastestRoute.add_child(popup) principal.save(self.htmlPath.absoluteFilePath("test.html")) self.view.load(QUrl().fromLocalFile(self.htmlPath.absoluteFilePath("test.html"))) self.setGeometry(100, 100, 1200, 900) self.show() @pyqtSlot(str) def pathSelected(self, lat): print(lat)
class Form(QWidget): def __init__(self): QWidget.__init__(self, flags=Qt.Widget) # 레이아웃 선언 및 Form Widget에 설정 self.layout_1 = QBoxLayout(QBoxLayout.LeftToRight, self) self.layout_2 = QBoxLayout(QBoxLayout.LeftToRight) self.layout_3 = QBoxLayout(QBoxLayout.TopToBottom) # 부모 레이아웃에 자식 레이아웃을 추가 self.layout_1.addLayout(self.layout_2) self.layout_1.addLayout(self.layout_3) self.web = QWebEngineView() self.pb_1 = QPushButton("요청하기") self.pb_2 = QPushButton("밝기지도") self.pb_3 = QPushButton("길찾기") # self.te_1 = QTextEdit() # Web과 통신할 수 있게 채널링 channel = QWebChannel(self.web.page()) self.web.page().setWebChannel(channel) self.handler = CallHandler() # 반드시 인스턴스 변수로 사용해야 한다. channel.registerObject('handler', self.handler) # js에서 불리울 이름 self.setLayout(self.layout_1) self.init_widget() def init_widget(self): self.setWindowTitle("QWebChannel") self.setFixedWidth(360) self.setFixedHeight(640) # 로컬파일 사용시 절대경로만 사용해야 함 #url = QDir().current().filePath("html/QWebEngineView_02_WebChannel.html") url = os.path.join(settings.BASE_DIR, 'Lumos_UI', 't-map', 'index.html') url = QUrl.fromLocalFile(url) self.web.load(url) # 핸들러 시그널 버튼이 눌러지면 console로 Hi를 보낸다. self.pb_1.clicked.connect( lambda v: self.handler.getText.emit(txt)) ##경로얻어오기 self.pb_2.clicked.connect( lambda v: self.web.setUrl(QUrl("http://google.com"))) ##밝기지도 self.pb_3.clicked.connect( lambda v: self.web.setUrl(QUrl(url))) ##길찾기 API self.layout_2.addWidget(self.web)
def test_webview(self): from PyQt5.QtWebEngineWidgets import QWebEngineView from PyQt5.QtCore import QUrl, QTimer app = QApplication([]) view = QWebEngineView() # Use a raw string to avoid accidental special characters in Windows filenames: # ``c:\temp`` is `c<tab>emp`! view.load(QUrl("http://www.pyinstaller.org")) view.show() view.page().loadFinished.connect( # Display the web page for one second after it loads. lambda ok: QTimer.singleShot(5000, app.quit)) app.exec_()
class X0h(XrayServerWidget): name = "X0h" description = "X0h" icon = "icons/x0h.png" maintainer = "Luca Rebuffi" maintainer_email = "luca.rebuffi(@at@)elettra.eu" priority = 1 category = "X0h" keywords = ["data", "file", "load", "read"] want_main_area = 1 outputs = [{"name": "xrayserver_data", "type": DataExchangeObject, "doc": "xrayserver_data", "id": "xrayserver_data"}, ] def __init__(self): super().__init__() left_box_1 = oasysgui.widgetBox(self.controlArea, "X0h Request Form", addSpace=True, orientation="vertical", width=610, height=640) html = self.clear_input_form(HttpManager.send_xray_server_direct_request("/cgi/www_form.exe?template=x0h_form.htm")) self.x0h_input = QWebView(left_box_1) self.x0h_input.setHtml(html) left_box_1.layout().addWidget(self.x0h_input) self.x0h_input.setFixedHeight(540) self.x0h_input.setFixedWidth(590) button = gui.button(self.controlArea, self, "Get X0h!", callback=self.submit) button.setFixedHeight(30) gui.rubber(self.controlArea) self.tabs = [] self.tabs_widget = oasysgui.tabWidget(self.mainArea) self.initializeTabs() self.x0h_output = QWebView(self.tabs[0]) self.tabs[0].layout().addWidget(self.x0h_output) self.x0h_output.setFixedHeight(630) self.x0h_output.setFixedWidth(740) def clear_input_form(self, html): temp_1 = html.split("<body onload=\"setOnloads()\">")[0] temp_2 = html.split("<table cellspacing=0 cellpadding=0 border=0 bgcolor=\"#c1c1c1\"><tr><td>")[1] html = temp_1 + "<body>\n<table cellspacing=0 cellpadding=0 border=0 bgcolor=\"#c1c1c1\"><tr><td>\n" + temp_2 html = html.split("<input type=SUBMIT value=\"Get X0h!\"><input type=RESET> <br>")[0] html += "\n<input type=SUBMIT style=\"display: none;\" id=\"submit-btn\"><input type=RESET style=\"display: none;\" id=\"reset-btn\"> <br>" html += "\n</form>" html += "\n</td></tr></table>" html += "\n</td></tr></table>" html += "\n</body>" html += "\n</html>" temp_1, temp_2 = html.split("x0h.js") html = temp_1 + XRAY_SERVER_URL + "/x0h.js" + temp_2 temp_1, temp_2 = html.split("/cgi/x0h_form.exe") html = temp_1 + XRAY_SERVER_URL + "/cgi/x0h_form.exe" + temp_2 return html def getLeftPartWidth(self): return 620 def initializeTabs(self): current_tab = self.tabs_widget.currentIndex() size = len(self.tabs) for index in range(0, size): self.tabs_widget.removeTab(size-1-index) self.tabs = [gui.createTabPage(self.tabs_widget, "X-ray Server Ouput"), gui.createTabPage(self.tabs_widget, "Critical Angle for TER"), gui.createTabPage(self.tabs_widget, "Darwin Curve (" + u"\u03C3" + " Pol.)"), gui.createTabPage(self.tabs_widget, "Darwin Curve (" + u"\u03C0" + " Pol.)"), ] for tab in self.tabs: tab.setFixedHeight(650) tab.setFixedWidth(750) self.plot_canvas = [None, None, None] self.tabs_widget.setCurrentIndex(current_tab) def js_callback(self, result): pass def _callable_1(self, html): self.original_signal = self.x0h_input.loadFinished self.x0h_input.loadFinished.connect(self.loadFinished) self.x0h_input.setHidden(True) self.x0h_input.page().runJavaScript("document.getElementById('submit-btn').click()", self.js_callback) def loadFinished(self): self.x0h_input.page().toHtml(self._callable_2) def _callable_2(self, html): try: self.x0h_input.loadFinished.disconnect() self.x0h_input.back() self.x0h_input.setHidden(False) response_1 = self.clear_response(html) response_2 = self.clear_response(html) self.tabs_widget.setCurrentIndex(0) self.x0h_output.setHtml(response_1) data0, data1, data2 = self.extract_plots(response_2) exchange_data = DataExchangeObject("XRAYSERVER", "X0H") exchange_data.add_content("reflectivity", data0) exchange_data.add_content("reflectivity_units_to_degrees", 1.0) exchange_data.add_content("x-ray_diffraction_profile_sigma", data1) exchange_data.add_content("x-ray_diffraction_profile_sigma_units_to_degrees", 0.000277777805) exchange_data.add_content("x-ray_diffraction_profile_pi", data2) exchange_data.add_content("x-ray_diffraction_profile_pi_units_to_degrees", 0.000277777805) self.send("xrayserver_data", exchange_data) except urllib.error.HTTPError as e: self.x0h_output.setHtml('The server couldn\'t fulfill the request.\nError Code: ' + str(e.code) + "\n\n" + server.BaseHTTPRequestHandler.responses[e.code][1]) except urllib.error.URLError as e: self.x0h_output.setHtml('We failed to reach a server.\nReason: ' + e.reason) except XrayServerException as e: ShowHtmlDialog.show_html("X-ray Server Error", e.response, width=750, height=500, parent=self) except Exception as e: self.x0h_output.setHtml('We failed to reach a server.\nReason: ' + str(e)) self.tabs_widget.setCurrentIndex(0) self.setStatusMessage("") self.progressBarFinished() def submit(self): self.progressBarInit() self.setStatusMessage("Submitting Request") if platform.system() == 'Darwin': self.x0h_input.page().toHtml(self._callable_1) elif platform.system() == 'Linux': doc = self.x0h_input.page().mainFrame().documentElement() submit_btn = doc.findFirst("input[id=submit-btn]") try: response = "" #response = HttpManager.send_xray_server_request_POST(APPLICATION, parameters) response = self.clear_response(response) self.tabs_widget.setCurrentIndex(0) self.x0h_output.setHtml(response) data0, data1, data2 = self.extract_plots(response) exchange_data = DataExchangeObject("XRAYSERVER", "X0H") exchange_data.add_content("reflectivity", data0) exchange_data.add_content("reflectivity_units_to_degrees", 1.0) exchange_data.add_content("x-ray_diffraction_profile_sigma", data1) exchange_data.add_content("x-ray_diffraction_profile_sigma_units_to_degrees", 0.000277777805) exchange_data.add_content("x-ray_diffraction_profile_pi", data2) exchange_data.add_content("x-ray_diffraction_profile_pi_units_to_degrees", 0.000277777805) self.send("xrayserver_data", exchange_data) pass except urllib.error.HTTPError as e: self.x0h_output.setHtml('The server couldn\'t fulfill the request.\nError Code: ' + str(e.code) + "\n\n" + server.BaseHTTPRequestHandler.responses[e.code][1]) raise e except urllib.error.URLError as e: self.x0h_output.setHtml('We failed to reach a server.\nReason: ' + e.reason) raise e except XrayServerException as e: ShowHtmlDialog.show_html("X-ray Server Error", e.response, width=750, height=500, parent=self) raise e except Exception as e: self.x0h_output.setHtml('We failed to reach a server.\nReason: ' + str(e)) raise e self.setStatusMessage("") self.progressBarFinished() def clear_response(self, response): print(response) # remove links output = response.split("<img src=\"images/x.gif\" width=\"31\" height=\"32\" border=\"0\">")[0] + "\n</body></html>" # remove "get the curve" images output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the reflectivity curve\">")) output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the Bragg curve (sigma)\">")) output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the Bragg curve (pi)\">")) # remove question mark images and links output = "".join(output.split("<a href=\"javascript:void(0)\" onClick=\"Wfloat(\'images/x0h_help_0.gif\',\'x0h_0\',740,357);\"><b>?</b></a> ")) output = "".join(output.split("<a href=\"javascript:void(0)\" onClick=\"Wfloat(\'images/x0h_help_h.gif\',\'x0h_h\',705,853);\"><b>?</b></a> ")) temp_1, temp_2 = output.split("style.css") output = temp_1 + XRAY_SERVER_URL + "/style.css" + temp_2 return output def extract_plots(self, response): form_1_begin = False form_2_begin = False form_3_begin = False form_1 = None form_2 = None form_3 = None rows = response.split("\n") for row in rows: if form_1_begin: if "<td>" in row: form_1_begin = False elif form_2_begin: if "<td>" in row: form_2_begin = False elif form_3_begin: if "<td>" in row: form_3_begin = False if form_1_begin: form_1.append(row) elif form_2_begin: form_2.append(row) elif form_3_begin: form_3.append(row) if "/cgi/ter_form.pl" in row: if form_1 is None: form_1 = [] form_1_begin = True if "/cgi/gid_form.pl" in row: if form_2 is None: form_2 = [] form_2_begin = True elif form_3 is None: form_3 = [] form_3_begin = True self.setStatusMessage("Plotting Results") if not form_1 is None: x_1, y_1 = self.get_plots_from_form("/cgi/ter_form.pl", form_1) self.plot_histo(x_1, y_1, 40, 1, 0, "Critical Angle for TER", "Incidence angle [degrees]", "Reflectivity") self.tabs_widget.setCurrentIndex(1) else: x_1 = None y_1 = None if not form_2 is None: x_2, y_2 = self.get_plots_from_form("/cgi/gid_form.pl", form_2) self.plot_histo(x_2, y_2, 60, 2, 1, "Darwin Curve ($\sigma$ Pol.)", "Scan Angle [arcsec]", "Diffracted Intensity") self.tabs_widget.setCurrentIndex(2) else: x_2 = None y_2 = None if not form_3 is None: x_3, y_3 = self.get_plots_from_form("/cgi/gid_form.pl", form_3) self.plot_histo(x_3, y_3, 80, 3, 2, "Darwin Curve ($\pi$ Pol.)", "Scan Angle [arcsec]", "Diffracted Intensity") self.tabs_widget.setCurrentIndex(3) else: x_3 = None y_3 = None return [x_1, y_1], [x_2, y_2], [x_3, y_3]
class MainWindow(QMainWindow): """Main window class.""" def __init__(self): """Init class.""" super(MainWindow, self).__init__() self.pixmap_syncthingui = QPixmap(":/images/syncthingui.svg") tf = QTransform() self.pixmap_syncthingui0 = QPixmap(":/images/syncthingui.svg") tf.rotate(90.0) self.pixmap_syncthingui1 = self.pixmap_syncthingui0.transformed(tf) tf.rotate(180.0) self.pixmap_syncthingui2 = self.pixmap_syncthingui0.transformed(tf) tf.rotate(270.0) self.pixmap_syncthingui3 = self.pixmap_syncthingui0.transformed(tf) self.init_gui() self.init_menu() self.init_systray() self.run() def init_gui(self): """init gui setup""" self.setWindowIcon(QIcon(self.pixmap_syncthingui)) self.progressbar = QProgressBar() self.statusBar().showMessage(getoutput(SYNCTHING + ' --version')) self.statusBar().addPermanentWidget(self.progressbar) self.setWindowTitle(__doc__.strip().capitalize()) self.setMinimumSize(900, 600) self.setMaximumSize(1280, 1024) self.resize(self.minimumSize()) self.center() # QWebView # self.view = QWebView(self) self.view = QWebEngineView(self) self.view.loadStarted.connect(self.start_loading) self.view.loadFinished.connect(self.finish_loading) self.view.loadProgress.connect(self.loading) self.view.titleChanged.connect(self.set_title) self.view.page().linkHovered.connect( lambda link_txt: self.statusBar().showMessage(link_txt[:99], 3000)) QShortcut("Ctrl++", self, activated=lambda: self.view.setZoomFactor(self.view.zoomFactor() + 0.2)) QShortcut("Ctrl+-", self, activated=lambda: self.view.setZoomFactor(self.view.zoomFactor() - 0.2)) QShortcut("Ctrl+0", self, activated=lambda: self.view.setZoomFactor(1)) QShortcut("Ctrl+q", self, activated=lambda: self.close()) # syncthing console self.consolewidget = QWidget(self) # TODO: start at specify (w,h) self.consolewidget.setMinimumSize(QSize(200, 100)) # TODO: setStyleSheet # self.consolewidget.setStyleSheet("margin:0px; padding: 0px; \ # border:1px solid rgb(0, 0, 0);") # border-radius: 40px;") # TODO read syncthing console visible from setting # self.consolewidget.setVisible(False) # self.consolewidget.showEvent # self.consoletextedit = QPlainTextEdit(parent=self.consolewidget) self.consoletoolbar = QWidget(self) hlayout = QHBoxLayout() hlayout self.consoletoolbar.setLayout(hlayout) self.consoletextedit = QTextEdit(parent=self.consolewidget) self.consoletextedit.setWordWrapMode(QTextOption.NoWrap) # self.consoletextedit.setStyleSheet(" border:1px solid rgb(0, 0, 0);") # self.consoletextedit.setStyleSheet("margin:0px; padding: 0px;") layout = QVBoxLayout() layout.addWidget(self.consoletoolbar) layout.addWidget(self.consoletextedit) self.consolewidget.setLayout(layout) self.splitter = QSplitter(Qt.Vertical) self.splitter.addWidget(self.view) self.splitter.addWidget(self.consolewidget) # process self.process = QProcess() self.process.error.connect(self._process_failed) # QProcess emits `readyRead` when there is data to be read self.process.readyRead.connect(self._process_dataReady) self.process.stateChanged.connect(self._process_stateChanged) # Just to prevent accidentally running multiple times # Disable the button when process starts, and enable it when it finishes # self.process.started.connect(lambda: self.runButton.setEnabled(False)) # self.process.finished.connect(lambda: self.runButton.setEnabled(True)) # backend options self.chrt = QCheckBox("Smooth CPU ", checked=True) self.ionice = QCheckBox("Smooth HDD ", checked=True) self.chrt.setToolTip("Use Smooth CPUs priority (recommended)") self.ionice.setToolTip("Use Smooth HDDs priority (recommended)") self.chrt.setStatusTip(self.chrt.toolTip()) self.ionice.setStatusTip(self.ionice.toolTip()) # main toolbar self.toolbar = self.addToolBar("SyncthinGUI Toolbar") # self.toolbar.addAction(QIcon.fromTheme("media-playback-stop"), self.toolbar.addAction(QIcon(":/images/stop.svg"), "Stop Sync", lambda: self.syncthing_stop()) # self.toolbar.addAction(QIcon.fromTheme("media-playback-start"), self.toolbar.addAction(QIcon(":/images/start.svg"), "Restart Sync", lambda: self.run()) self.toolbar.addSeparator() self.toolbar.addWidget(self.chrt) self.toolbar.addWidget(self.ionice) self.toolbar.addSeparator() # TODO: test event API self.toolbar.addAction(QIcon(":/images/start.svg"), "test ", lambda: self.test()) # final gui setup self.setCentralWidget(self.splitter) def test(self): """ test some function """ print("test") def init_menu(self): """init menu setup""" # file menu file_menu = self.menuBar().addMenu("File") # TODO: setting menu item file_menu.addAction("Exit", lambda: self.close()) # Syncthing menu sync_menu = self.menuBar().addMenu("Syncthing") sync_menu.addAction("Start Syncronization", lambda: self.run()) sync_menu.addAction("Stop Syncronization", lambda: self.syncthing_stop()) # TODO: restart # TODO: reflash F5 sync_menu.addAction("Open in external browser", lambda: open_new_tab(URL)) # view menu view_menu = self.menuBar().addMenu("View") # TODO: syncthing console menu view_menu.addAction("syncthing console", lambda: self.show_console) # zoom_menu = view_menu.addMenu("Zoom browser") zoom_menu.addAction( "Zoom In", lambda: self.view.setZoomFactor(self.view.zoomFactor() + .2)) zoom_menu.addAction( "Zoom Out", lambda: self.view.setZoomFactor(self.view.zoomFactor() - .2)) zoom_menu.addAction( "Zoom To...", lambda: self.view.setZoomFactor(QInputDialog.getInt( self, __doc__, "<b>Zoom factor ?:", 1, 1, 9)[0])) zoom_menu.addAction("Zoom Reset", lambda: self.view.setZoomFactor(1)) view_menu.addSeparator() act = view_menu.addAction("View Page Source", lambda: self.view_syncthing_source) act.setDisabled(True) # window menu window_menu = self.menuBar().addMenu("&Window") window_menu.addAction("Minimize", lambda: self.showMinimized()) window_menu.addAction("Maximize", lambda: self.showMaximized()) window_menu.addAction("Restore", lambda: self.showNormal()) window_menu.addAction("Center", lambda: self.center()) window_menu.addAction("Top-Left", lambda: self.move(0, 0)) window_menu.addAction("To Mouse", lambda: self.move_to_mouse_position()) window_menu.addAction("Fullscreen", lambda: self.showFullScreen()) window_menu.addSeparator() window_menu.addAction("Increase size", lambda: self.resize( self.size().width() * 1.2, self.size().height() * 1.2)) window_menu.addAction("Decrease size", lambda: self.resize( self.size().width() // 1.2, self.size().height() // 1.2)) window_menu.addAction("Minimum size", lambda: self.resize(self.minimumSize())) window_menu.addAction("Maximum size", lambda: self.resize(self.maximumSize())) window_menu.addAction("Horizontal Wide", lambda: self.resize( self.maximumSize().width(), self.minimumSize().height())) window_menu.addAction("Vertical Tall", lambda: self.resize( self.minimumSize().width(), self.maximumSize().height())) window_menu.addSeparator() window_menu.addAction("Disable Resize", lambda: self.setFixedSize(self.size())) # help menu help_menu = self.menuBar().addMenu("&Help") help_menu.addAction("Support Forum", lambda: open_new_tab(HELP_URL_0)) help_menu.addAction("Lastest Release", lambda: open_new_tab(HELP_URL_1)) help_menu.addAction("Documentation", lambda: open_new_tab(HELP_URL_2)) help_menu.addAction("Bugs", lambda: open_new_tab(HELP_URL_3)) help_menu.addAction("Source Code", lambda: open_new_tab(HELP_URL_4)) help_menu.addSeparator() help_menu.addAction("About Qt 5", lambda: QMessageBox.aboutQt(self)) help_menu.addAction("About Python 3", lambda: open_new_tab('https://www.python.org')) help_menu.addAction("About " + __doc__, lambda: QMessageBox.about(self, __doc__, HELPMSG)) help_menu.addSeparator() help_menu.addAction("Keyboard Shortcuts", lambda: QMessageBox.information(self, __doc__, SHORTCUTS)) help_menu.addAction("View GitHub Repo", lambda: open_new_tab(__url__)) if not sys.platform.startswith("win"): help_menu.addAction("Show Source Code", lambda: self.view_source()) help_menu.addSeparator() help_menu.addAction("Check Updates", lambda: self.check_for_updates()) def init_systray(self): """init system tray icon""" # self.tray = QSystemTrayIcon(QIcon(self.pixmap_syncthingui), self) self.tray = AnimatedSysTrayIcon(QIcon(self.pixmap_syncthingui), self) self.tray.add_ani_icon(QIcon(self.pixmap_syncthingui0)) self.tray.add_ani_icon(QIcon(self.pixmap_syncthingui1)) self.tray.add_ani_icon(QIcon(self.pixmap_syncthingui2)) self.tray.add_ani_icon(QIcon(self.pixmap_syncthingui3)) self.tray.setToolTip(__doc__.strip().capitalize()) traymenu = QMenu(self) traymenu.addAction(__doc__).setDisabled(True) traymenu.addSeparator() # to test animate # traymenu.addAction("start", lambda: self.tray.animate_start()) # traymenu.addAction("stop", lambda: self.tray.animate_stop()) # traymenu.addSeparator() traymenu.addAction("Stop Sync", lambda: self.syncthing_stop()) traymenu.addAction("Restart Sync", lambda: self.run()) traymenu.addSeparator() traymenu.addAction("Show", lambda: self.show_gui()) traymenu.addAction("Hide", lambda: self.hide()) traymenu.addSeparator() # traymenu.addAction("Open Web", lambda: open_new_tab(URL)) # traymenu.addAction("Quit All", lambda: self.close()) traymenu.addAction("Quit All", lambda: self.app_exit()) self.tray.setContextMenu(traymenu) self.tray.show() def show_gui(self): """ Helper method to show UI, this should not be needed, but I discovered. """ self.showNormal() # webview require 70Mb to show webpage self.view.load(QUrl(URL)) def syncthing_start(self): """syncthing start""" self.run() def syncthing_stop(self): """syncthing stop""" print("try to stop syncthing") self.process.kill() # check there is no other syncthing is running! for proc in psutil.process_iter(): # check whether the process name matches # print("procress: %s " % proc.name()) if proc.name() == SYNCTHING: proc.kill() def run(self): """Run bitch run!.""" # Stop first! self.syncthing_stop() command_to_run_syncthing = " ".join(( "ionice --ignore --class 3" if self.ionice.isChecked() else "", "chrt --verbose --idle 0" if self.chrt.isChecked() else "", SYNCTHING, "-no-browser")) print(command_to_run_syncthing) self.process.start(command_to_run_syncthing) if not self.process.waitForStarted(): self._process_failed() @pyqtSlot() def _process_failed(self): """Read and return errors.""" self.statusBar().showMessage("ERROR:Fail:Syncthing blow up in pieces!") print("ERROR:Fail:Syncthing blow up in pieces! Wheres your God now?") return str(self.process.readAllStandardError()).strip().lower() @pyqtSlot() def _process_dataReady(self): """get process stdout/strerr when data ready""" # TODO: format the msg to remove extra b and \n msg = str(self.process.readAll()) lines = msg.split("'") tmp = lines[1] tmp = tmp.splitlines(0) lines = tmp[0].split("\\n") for line in lines: if line != "": # print("1: %s" % line) self.consoletextedit.append(line) self.consoletextedit.ensureCursorVisible() # autoscroll to last line's first character self.consoletextedit.moveCursor(QTextCursor.End) self.consoletextedit.moveCursor(QTextCursor.StartOfLine) @pyqtSlot(QProcess.ProcessState) def _process_stateChanged(self, state): """ procress_stateChanged """ # TODO handle procress_stateChanged print("procress_stateChanged: %s" % state) def center(self): """Center Window on the Current Screen,with Multi-Monitor support.""" window_geometry = self.frameGeometry() mousepointer_position = QApplication.desktop().cursor().pos() screen = QApplication.desktop().screenNumber(mousepointer_position) centerpoint = QApplication.desktop().screenGeometry(screen).center() window_geometry.moveCenter(centerpoint) self.move(window_geometry.topLeft()) def move_to_mouse_position(self): """Center the Window on the Current Mouse position.""" window_geometry = self.frameGeometry() window_geometry.moveCenter(QApplication.desktop().cursor().pos()) self.move(window_geometry.topLeft()) def show_console(self): """Show syncthing console""" visible = not self.consolewidget.isVisible print("bVisible: %s" % visible) self.consolewidget.setVisible(True) self.consolewidget.resize(QSize(200, 100)) def view_source(self): """ TODO: Call methods to load and display source code.""" # call(('xdg-open ' if sys.platform.startswith("linux") else 'open ') # + __file__, shell=True) pass def view_syncthing_source(self): """Call methods to load and display web page source code.""" print("view_syncthing_source start") # access_manager = self.view.page().networkAccessManager() # reply = access_manager.get(QNetworkRequest(self.view.url())) # reply.finished.connect(self.slot_source_downloaded) def slot_source_downloaded(self): """Show actual page source code.""" reply = self.sender() # TODO: highlight html source editor/viewer self.textedit = QPlainTextEdit() self.textedit.setAttribute(Qt.WA_DeleteOnClose) self.textedit.setReadOnly(True) self.textedit.setPlainText(QTextStream(reply).readAll()) self.textedit.show() reply.deleteLater() @pyqtSlot() def start_loading(self): """show progressbar when downloading data""" self.progressbar.show() @pyqtSlot(bool) def finish_loading(self, finished): """Finished loading content.""" if not finished: # TODO: When loading fail, what should we do? print("load fail") if self.process.state() == QProcess.NotRunning: self.run() self.view.reload() # if self.process.state != QProcess.Running: # print("syncthing is not running: %s" % self.process.state()) # pass print("finish_loading: %s" % finished) # TODO: WebEngineView does not have following function? # self.view.settings().clearMemoryCaches() # self.view.settings().clearIconDatabase() # print("finish_loading %s" % datetime.strftime(datetime.now(), # '%Y-%m-%d %H:%M:%S')) # TODO: following line need 6 sec to finish!! # TODO: (" INFO: Loading Web UI increases >250Mb RAM!.") # self.view.page().mainFrame().evaluateJavaScript(BASE_JS) # print("finish_loading %s" % datetime.strftime(datetime.now(), # '%Y-%m-%d %H:%M:%S')) self.progressbar.hide() @pyqtSlot(int) def loading(self, idx): """loading content""" #print("loading %s" % idx) self.progressbar.setValue(idx) @pyqtSlot(str) def set_title(self, title): """set title when webview's title change""" # print("title: %s" % title) if len(title.strip()) > 0: self.setWindowTitle(self.view.title()[:99]) def check_for_updates(self): """Method to check for updates from Git repo versus this version.""" # print("TODO: https://github.com/coolshou/syncthingui/releases/latest") print("__version__: %s" % __version__) ''' this_version = str(open(__file__).read()) print("this_version: %s" % this_version) last_version = str(request.urlopen(__source__).read().decode("utf8")) print("last_version: %s" % last_version) TODO: previous use file compare, when diff then there is new file!! if this_version != last_version: m = "Theres new Version available!<br>Download update from the web" else: m = "No new updates!<br>You have the lastest version of" + __doc__ return QMessageBox.information(self, __doc__.title(), "<b>" + m) ''' def closeEvent(self, event): """Ask to Quit.""" if self.tray.isVisible(): if self.tray.supportsMessages(): self.tray.showMessage("Info", "The program will keep running in the " "system tray. To terminate the program," " choose <b>Quit</b> in the context " "menu of the system tray entry.") else: print(" System tray not supports balloon messages ") self.hide() event.ignore() def app_exit(self): """exit app""" # TODO: do we need to show UI when doing close? # self.show_gui() # TODO: show QMessageBox on all virtual desktop the_conditional_is_true = QMessageBox.question( self, __doc__.title(), 'Quit %s?' % __doc__, QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.Yes if the_conditional_is_true: self.syncthing_stop() self.ani_stop = True QApplication.instance().quit quit()
class BrowserWindow(QWidget): urlChanged = pyqtSignal() def __init__(self, svc, url='', windowType=QWebEnginePage.WebBrowserWindow, isLatent=False): super().__init__() self.svc = svc self.hoveredUrl = '' self.isLatent = isLatent self.isLoading = False self.nextUrl = QUrl('') self.initUI(windowType) if url != '': self.cmdLine.setText(url) self.handleCommand() else: self.beginEnteringCommand(None) def beginEnteringCommand(self, cmd): self.cmdLine.setFocus(Qt.OtherFocusReason) if cmd is None: self.cmdLine.setText(self.webView.page().url().toDisplayString()) self.cmdLine.selectAll() else: self.cmdLine.setText(cmd) def handleCommand(self): cmd = self.cmdLine.text() if cmd.startswith('?'): self.webView.page().load(QUrl('https://duckduckgo.com/?q=' + cmd[1:].strip())) elif cmd.startswith('/'): self.webView.page().findText(cmd[1:].strip()) else: url = urlparse(cmd) if url.scheme == '': url = url._replace(scheme='https') self.webView.page().load(QUrl(url.geturl())) def toggleSource(self): url = self.webView.page().url().toDisplayString() if url == '': return prefix = 'view-source:' if url.startswith(prefix): url = url[len(prefix):] else: url = prefix + url self.webView.page().load(QUrl(url)) @pyqtSlot(str) def onLinkHovered(self, url): self.hoveredUrl = url self.urlChanged.emit() def url(self): if self.isLoading: return self.nextUrl else: return self.webView.page().url() @pyqtSlot() def onUrlChanged(self): if self.hoveredUrl != '': self.urlLabel.setText('<span style="color: gray">{}</span>'.format(html.escape(self.hoveredUrl))) else: self.urlLabel.setText(html.escape(self.url().toDisplayString())) @pyqtSlot() def onTitleChanged(self): title = self.webView.page().title() if title == '': self.setWindowTitle('shower') else: self.setWindowTitle('shower: ' + title) def addShortcut(self, key, handler): shortcut = QShortcut(QKeySequence(key), self) shortcut.activated.connect(handler) return shortcut @pyqtSlot() def onLoadStarted(self): self.isLoading = True self.stopShortcut.setEnabled(True) self.progressLabel.setText('<span style="color: yellow">[ 0%]</span>') @pyqtSlot(int) def onLoadProgress(self, n): if n == 100: self.progressLabel.setText('<span style="color: green">[100]</span>'.format(n)) else: self.progressLabel.setText('<span style="color: yellow">[{:2d}%]</span>'.format(n)) @pyqtSlot() def onLoadFinished(self): self.isLoading = False self.stopShortcut.setEnabled(False) self.urlChanged.emit() def initUI(self, windowType): self.setStyleSheet(""" #cmdLine, #bar, #bar > * { border: 0px; background: #070707; font-family: "Pro Font"; font-size: 10px; color: white; min-height: 17px } """) self.setWindowTitle('shower') self.setAttribute(Qt.WA_DeleteOnClose) vbox = QVBoxLayout() self.setLayout(vbox) vbox.setContentsMargins(0, 0, 0, 0) vbox.setSpacing(0) bar = QWidget() bar.setObjectName('bar') hbox = QHBoxLayout() hbox.setContentsMargins(2, 0, 0, 0) hbox.setSpacing(0) bar.setLayout(hbox) vbox.addWidget(bar) self.urlLabel = QLabel() self.urlLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Preferred) self.urlLabel.setTextFormat(Qt.RichText) hbox.addWidget(self.urlLabel) hbox.setStretch(0, 1) self.progressLabel = QLabel() self.progressLabel.setTextFormat(Qt.RichText) hbox.addWidget(self.progressLabel) self.cmdLine = QLineEdit() self.cmdLine.setObjectName('cmdLine') vbox.addWidget(self.cmdLine) self.webView = QWebEngineView() self.webView.setPage(BrowserPage(self)) vbox.addWidget(self.webView) self.cmdLine.returnPressed.connect(self.handleCommand) self.webView.page().linkHovered.connect(self.onLinkHovered) self.webView.page().urlChanged.connect(self.urlChanged) self.webView.page().titleChanged.connect(self.onTitleChanged) self.webView.page().loadProgress.connect(self.onLoadProgress) self.webView.page().loadStarted.connect(self.onLoadStarted) self.webView.page().loadFinished.connect(self.onLoadFinished) self.urlChanged.connect(self.onUrlChanged) self.addShortcut("Alt+Left", lambda: self.webView.page().triggerAction(QWebEnginePage.Back)) self.addShortcut("Alt+Right", lambda: self.webView.page().triggerAction(QWebEnginePage.Forward)) self.addShortcut("Ctrl+R", lambda: self.webView.page().triggerAction(QWebEnginePage.Reload)) self.addShortcut("Ctrl+Shift+R", lambda: self.webView.page().triggerAction(QWebEnginePage.ReloadAndBypassCache)) self.stopShortcut = self.addShortcut("Esc", lambda: self.webView.page().triggerAction(QWebEnginePage.Stop)) self.addShortcut("Ctrl+W", lambda: self.close()) self.addShortcut("Ctrl+L", lambda: self.beginEnteringCommand(None)) self.addShortcut("Ctrl+K", lambda: self.beginEnteringCommand('? ')) self.addShortcut("Ctrl+/", lambda: self.beginEnteringCommand('/ ')) self.addShortcut("Ctrl+U", lambda: self.toggleSource())
class HelpDialog(QObject, LogMixin): """Class implementing qthelp viewer dialog""" def __init__(self, qthelp_file, parent = None): """ Constructor of HelpDialog :param qthelp_file: full path to qthelp helpfile """ super(HelpDialog,self).__init__(parent) # instantiate help engine helpEngine = QHelpEngine(qthelp_file) helpEngine.setupData() self._helpEngine = helpEngine # base dialog widget self.ui = QDialog(None, QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinMaxButtonsHint | QtCore.Qt.WindowCloseButtonHint ) self.ui.setWindowTitle("HelpViewer") self.ui.setWindowIcon(QIcon(":/images/prog_icons/help/help.ico")) # Create webview for help information # and assign a custom URL scheme handler for scheme "qthelp) self._wv = QWebEngineView(self.ui) self._urlschemehandler = HelpSchemeHandler(self._helpEngine, self._wv.page().profile()) self._wv.page().profile().installUrlSchemeHandler(b'qthelp', self._urlschemehandler) # get help content overview widget self._helpContent = self._helpEngine.contentWidget() self._helpIndex = self._helpEngine.indexWidget() self._helpSearchQuery = self._helpEngine.searchEngine().queryWidget() self._helpSearchResult = self._helpEngine.searchEngine().resultWidget() self._se = self._helpEngine.searchEngine() self._se.reindexDocumentation() self._helpSearchQuery.search.connect(self.search) # create QSplitter self._splitterMain = QSplitter(QtCore.Qt.Vertical) self._splitterMain.setOpaqueResize(False) self._splitterSearch = QSplitter(QtCore.Qt.Horizontal) self._splitterSearch.setOpaqueResize(False) self._splitterUpper = QSplitter(QtCore.Qt.Horizontal) self._splitterUpper.setOpaqueResize(False) self._splitterLower = QSplitter(QtCore.Qt.Horizontal) self._splitterLower.setOpaqueResize(False) # create horzLayout self._horzLayoutSearch = QHBoxLayout() self._horzLayoutUpper = QHBoxLayout() self._horzLayoutLower = QHBoxLayout() # create vertLayout self._vertLayout = QVBoxLayout() # main widgets self._upperWidget = QWidget() self._lowerWidget = QWidget() self._btnReset = QPushButton() self._btnReset.setMaximumHeight(23) self._btnReset.setMaximumWidth(100) # build search structure self._splitterSearch.insertWidget(0, self._helpSearchQuery) self._splitterSearch.insertWidget(1, self._btnReset) # build upper inner structure self._splitterUpper.insertWidget(0, self._helpContent) self._splitterUpper.insertWidget(1, self._wv) self._horzLayoutUpper.addWidget(self._splitterUpper) self._upperWidget.setLayout(self._horzLayoutUpper) # build lower inner structure self._splitterLower.insertWidget(0, self._helpIndex) self._splitterLower.insertWidget(1, self._helpSearchResult) self._horzLayoutLower.addWidget(self._splitterLower) self._lowerWidget.setLayout(self._horzLayoutLower) # build outer structure self._splitterMain.insertWidget(0, self._splitterSearch) self._splitterMain.insertWidget(1, self._upperWidget) self._splitterMain.insertWidget(2, self._lowerWidget) self._helpSearchResult.hide() self._btnReset.hide() self._vertLayout.addWidget(self._splitterMain) self.ui.setLayout(self._vertLayout) # set splitter width w = self._splitterUpper.geometry().width() self._splitterUpper.setSizes([w*(1/4), w*(3/4)]) w = self._splitterLower.geometry().width() self._splitterLower.setSizes([w*(1/5), w*(4/5)]) h = self._splitterMain.geometry().height() self._splitterMain.setSizes([h*(1/9), h*(7/9), h*(1/9)]) self._helpContent.linkActivated.connect(self._wv.setUrl) self._helpIndex.linkActivated.connect(self._wv.setUrl) self._helpSearchResult.requestShowLink.connect(self._wv.setUrl) self._se.searchingFinished.connect(self.showResults) self._btnReset.clicked.connect(self.resetResult) self.retranslateMsg() def retranslateMsg(self): self.logger.debug("Retranslating further messages...") self._btnReset.setText(translate("HelpViewer", "Reset")) self._btnReset.setText(translate("HelpViewer", "Search")) def search(self): """Initiate qthelp search""" self._se.search(self._helpSearchQuery.query()) def showResults(self): """Show search results, if any""" if self._se.hitCount() > 0: self._helpIndex.hide() h = self._splitterMain.geometry().height() self._splitterMain.setSizes([h*(1/3), h*(1/3), h*(1/3)]) self._helpSearchResult.show() self._btnReset.show() def resetResult(self): """Reset search result widget""" self._helpSearchResult.hide() self._btnReset.hide() self._helpIndex.show() h = self._splitterMain.geometry().height() self._splitterMain.setSizes([h*(1/9), h*(7/9), h*(1/9)])
from PyQt5.QtWebChannel import QWebChannel import sys # 创建一个 application实例 app = QApplication(sys.argv) win = QWidget() win.setWindowTitle('Web页面中的JavaScript与 QWebEngineView交互例子') # 创建一个垂直布局器 layout = QVBoxLayout() win.setLayout(layout) # 创建一个 QWebEngineView 对象 view = QWebEngineView() htmlUrl = 'http://127.0.0.1:8020/web/index.html' view.load( QUrl( htmlUrl )) # 创建一个 QWebChannel对象,用来传递pyqt参数到JavaScript channel = QWebChannel( ) myObj = MySharedObject() channel.registerObject( "bridge", myObj ) view.page().setWebChannel(channel) # 把QWebView和button加载到layout布局中 layout.addWidget(view) # 显示窗口和运行app win.show() sys.exit(app.exec_())
class DrrrWindow(ShadowsWindow): def __init__(self): super(DrrrWindow, self).__init__() self.setWindowTitle("Drrr Chat Room") self.setWindowIcon(QIcon('./img/drrr.ico')) # w = WebView() # w.show() self.getSetting() self.WebView = QWebEngineView() # self.WebView.load(QUrl("file:///E:/Project/DrrrPC/img/index.html")) self.WebView.setZoomFactor(0.8) # 设置加载网页,和网页加载完成以及加载过程信号与槽函数关联 self.WebView.loadStarted.connect(self.loadStarted) self.WebView.loadFinished.connect(self.loadFinished) self.WebView.loadProgress.connect(self.loading) self.cookieJar = QNetworkCookieJar() # self.WebView.page().networkAccessManager().setCookieJar(self.cookieJar) # self.WebView.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) # self.WebView.page().linkClicked.connect(self.linkClicked) # self.WebView.page().contentsChanged.connect(self.contentsChanged) # self.WebView.page().networkAccessManager().setHeader(QNetworkRequest.ContentTypeHeader, QVariant("text/html; charset=GBK")) # 重定义QWebEnginePage中javaScriptAlert等函数 self.WebView.page().javaScriptAlert = self._javascript_alert self.WebView.page().javaScriptConsoleMessage = self._javascript_console_message self.WebView.page().javaScriptConfirm = self._javascript_confirm self.WebView.page().javaScriptPrompt = self._javascript_prompt # NetworkAccessManager # self.NetworkAccessManager = QNetworkAccessManager() # self.WebView.page().setNetworkAccessManager(self.NetworkAccessManager) # self.NetworkAccessManager.finished.connect(self.NetworkAccessManagerReplyFinished) # self.NetworkAccessManager.get(QNetworkRequest(QUrl("http://www.baidu.com"))) # self.old_manager = self.WebView.page().networkAccessManager() # self.new_manager = NetworkAccessManager(self.old_manager) # self.WebView.page().setNetworkAccessManager(self.new_manager) self.titlebar = titleBar() self.statusBar = StatusWindow() # 中心窗口布局 self.contentLayout = QVBoxLayout() self.contentWidget = QWidget() self.contentWidget.gridLayout = QtWidgets.QGridLayout(self.contentWidget) self.contentWidget.gridLayout.addLayout(self.contentLayout, 0, 0, 1, 1) self.contentLayout.addWidget(self.WebView) self.contentWidget.gridLayout.setContentsMargins(0,0,0,0) self.contentLayout.setContentsMargins(1,0,1,0) self.contentWidget.setStyleSheet(""" border-left: 1px solid black; border-right: 1px solid black; """) # self.titlebar.titlebarBotton = QPushButton(self.titlebar) # self.titlebar.titlebarBotton.setText('Push ME') # self.titlebar.titlebarBotton.clicked.connect(self.getData) self.main_layout = QVBoxLayout() self.main_layout.addWidget(self.titlebar) self.main_layout.addWidget(self.contentWidget) self.main_layout.addWidget(self.statusBar) self.main_layout.setSpacing(0) # 窗口属性 self.setWindowFlags(Qt.Widget | QtCore.Qt.FramelessWindowHint) self.setAttribute(Qt.WA_NoSystemBackground, True) self.setAttribute(QtCore.Qt.WA_TranslucentBackground,True) self.widget = QWidget() self.setCentralWidget(self.widget) self.widget.setLayout(self.main_layout) self.widget.setMouseTracking(True) # self.resize(500,650) self.resize(650,650) # self.setMaximumHeight(660) self.center() # 将三个按钮点击信号与相关槽函数相关联 self.titlebar.min_button.clicked.connect(self.hideIt) self.titlebar.max_button.clicked.connect(self.MaxAndNormal) self.titlebar.close_button.clicked.connect(self.closeIt) # 状态栏进度条:将LoadProgress信号与loading槽函数相关联 self.WebView.loadProgress.connect(self.loading) # notice sound # self.player = self.WebView.setHtml(WaitingHTML) self.show() self.WebView.setStyleSheet(""" QWebView { background-color:black } QWebView::QScrollBar:Vertical { background-color:black } """) self.WebView.load(QUrl("http://drrr.com/")) def center(self,screenNum=0): '''多屏居中支持''' self.desktop = QApplication.desktop() screen = self.desktop.availableGeometry(screenNum) size = self.geometry() self.normalGeometry2 = QtCore.QRect((screen.width()-size.width())/2+screen.left(), (screen.height()-size.height())/2, size.width(),size.height()) self.setGeometry((screen.width()-size.width())/2+screen.left(), (screen.height()-size.height())/2, size.width(),size.height()) def keyPressEvent(self,event): # F11全屏切换 if event.key()==QtCore.Qt.Key_F11: self.MaxAndNormal() if event.key()==QtCore.Qt.Key_F4: self.WebView.page().mainFrame().setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff) def getData(self): # print self.bbb == None # print str(self.bbb) pass @QtCore.pyqtSlot(str) def play(self,content): # ["bubble","userin","userout"] print (content) QtMultimedia.QSound.play("./img/"+content+".wav") def readyRead(self): pass # print self.NetworkAccessManager.readAll() def NetworkAccessManagerReplyFinished(self,response): # NO USE # print response.readAll() # print response.header(QNetworkRequest.ContentTypeHeader) # print response.url() # self.bbb = response.readAll() response.deleteLater() def contentsChanged(self): # print 'contentsChanged' pass def _javascript_alert(self, webframe, message): print ('_javascript_alert') def _javascript_console_message(self, message, line, sourceid): print ("_javascript_console_message") def _javascript_confirm(self, webframe, message): print ("_javascript_confirm") return QWebPage.javaScriptConfirm(self.WebView.page(), webframe, message) def _javascript_prompt(self, webframe, message, defaultvalue, result): print ("_javascript_prompt") def linkClicked(self,url): print (url) # 获取ini格式的设置 def getSetting(self): '''获取应用设置''' self.settings = QtCore.QSettings("DrrrChatRoom.ini", QtCore.QSettings.IniFormat) def loadStarted(self): if 'http://drrr.com/' == str(self.WebView.url().toString()): frame = self.WebView.page() # name = frame.findFirstElement("input#form-name.home-name-input") # username = name.evaluateJavaScript("this.value") # print (username) # language = frame.findFirstElement("#form-language-select") # language = language.evaluateJavaScript("this.value") # print (language) frame.runJavaScript(""" var iconFun = function(){ var elementsLI = document.getElementsByTagName('li') var length = document.getElementsByTagName('li').length; for(var i = 0; i < length ; ++i){ if(elementsLI[i].getElementsByTagName('div')[0].className.indexOf("active")>=0){ var icon = elementsLI[i].getElementsByTagName('input')[0].value; } } return icon }; """) icon = frame.runJavaScript("""iconFun()""") print (icon) # if username:self.settings.setValue('username',username) # if language:self.settings.setValue("language",language) # if icon: # # self.settings.setValue("icon",icon) # pass # else: # if self.settings.value('icon', None): # icon = self.settings.value('icon',None) # frame.findFirstElement('input[value="'+icon+'"]').evaluateJavaScript("this.click()") # if "http://drrr.com/room/?ajax=1" in str(self.WebView.url().toString()): # print "quit room" pass print ('requestedUrl:' + self.WebView.url().toString()) def loadFinished(self, flag): self.statusBar.status.setText(u"Connected") # http://drrr.com/ if 'http://drrr.com/' == str(self.WebView.url().toString()): frame = self.WebView.page() # name = frame.findFirstElement("input#form-name.home-name-input") # if self.settings.value('username', None): # name.setAttribute('value',self.settings.value('username', None)) # language = frame.findFirstElement("#form-language-select") # if self.settings.value('language', None): # language.evaluateJavaScript(''' # sel = document.getElementById("form-language-select"); # for(var i = 0, j = sel.options.length; i < j; ++i) { # if(sel.options[i].value === "'''+self.settings.value('language', "zh-CN")+'''") { # sel.selectedIndex = i; # break; # } # } # ''') # # language.setAttribute('value',self.settings.value('language', None)) # if self.settings.value('icon', None): # icon = self.settings.value('icon',None) # frame.findFirstElement('input[value="'+icon+'"]').evaluateJavaScript("this.click()") # http://drrr.com/create_room/ if 'http://drrr.com/room/' in str(self.WebView.url().toString()): frame = self.WebView.page() # frame.addToJavaScriptWindowObject("drrrWindow", self) frame.runJavaScript(''' var volumeFun = function(b){ return b } ''') frame.runJavaScript(''' var playFun = function(a){ this.volume = volumeFun; drrrWindow.play(a); return this }; ''') frame.runJavaScript('''sound.play = playFun''') def loading(self, percent): self.statusBar.status.setText("Loading %d%%" % percent) def quit(self): sys.exit(0) # QtCore.QCoreApplication.instance().quit() def closeIt(self): self.animation = QtCore.QPropertyAnimation(self,"windowOpacity") self.animation.finished.connect(QtCore.QCoreApplication.instance().quit) self.animation.finished.connect(self.quit) self.animation.setDuration(300) self.animation.setStartValue(1) self.animation.setEndValue(0) self.animation.start() def hideIt(self): self.animation = QtCore.QPropertyAnimation(self,"windowOpacity") self.animation.finished.connect(self.showMinimized2) self.animation.setDuration(300) self.animation.setStartValue(1) self.animation.setEndValue(0) self.animation.start() def leaveEvent(self,event): self.setCursor(QtCore.Qt.ArrowCursor) def keyPressEvent(self,event): # F11全屏切换 if event.key()==QtCore.Qt.Key_F11: self.MaxAndNormal2() def MaxAndNormal2(self): '''全屏与正常大小间切换函数''' if self.showNormal3(): self.showFullScreen3() self.titlebar.hide() self.statusBar.hide() else: self.titlebar.show() self.statusBar.show() def MaxAndNormal(self): '''最大化与正常大小间切换函数''' if self.showNormal3(): self.showFullScreen3() #定义DrrrWindow显示动画 # def showEvent(self,event): # self.animation = QtCore.QPropertyAnimation(self,"windowOpacity") # self.animation.setDuration(300) # self.animation.setStartValue(0) # self.animation.setEndValue(1) # self.animation.start() def showNormal2(self): self.showNormal() self.animationEndFlag = 1 # 动画停止 def showNormal3(self): if self.isFullScreen(): self.main_layout.setContentsMargins(10,7,10,7) self.animation = QtCore.QPropertyAnimation(self,"geometry") self.animation.setDuration(180) self.animation.setEndValue(self.normalGeometry2) self.animation.setStartValue(self.desktop.availableGeometry(self.desktop.screenNumber(self.widget))) self.animation.finished.connect(self.showNormal2) self.animationEndFlag = 0 self.animation.start() return 0 return 1 def showFullScreen2(self): self.animationEndFlag = 1 # 动画停止 self.showFullScreen() def showFullScreen3(self): if not self.isFullScreen(): self.main_layout.setContentsMargins(0,0,0,0) self.animation = QtCore.QPropertyAnimation(self,"geometry") self.animation.setDuration(180) self.animation.setStartValue(self.geometry()) self.animation.setEndValue(self.desktop.availableGeometry(self.desktop.screenNumber(self.widget))) self.animation.finished.connect(self.showFullScreen2) self.animationEndFlag = 0 self.animation.start() def showMinimized2(self): self.setWindowOpacity(1) self.showMinimized()