рдкрд░рд┐рдЪрдп
рд╢рд╛рдпрдж, рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреНрдпреВрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИред WebKit рд╡реЗрдм рдкреЗрдЬ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЗрдВрдЬрди рд╕рднреА рдЕрдзрд┐рдХ рд╣реИред рдЗрддрдирд╛ рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдкрд╣рд▓реЗ рдореЗрдВ рджреВрд╕рд░реЗ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╢рд╛рдорд┐рд▓ рдерд╛, 50 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдлрд┐рд░ рднреА, рдХреНрдпреВрдЯреА рдХреЛрдб рд╕реЗ рдХрд┐рд╕реА рд╡реЗрдм рдкреЗрдЬ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рд╡рд┐рд╡рд░рдг рдореЗрдВ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ PyQt (рдореИрдВрдиреЗ рд╕рдорд░рдлрд╝реАрд▓реНрдб рд╕рд┐рдЦрд╛рдпрд╛), рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рд╕реНрддрд░ рдХреЛ рд╡реИрд╕рд╛ рд╣реА рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЦрд╛рд╕рдХрд░ рдЬрд╛рд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╡рд░реНрдгрди рдореЗрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, C ++ / Qt рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ рднреА рдХреЛрдИ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЛ рдЬреАрдПрдирдпреВ / рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд PyQt-4.7.3, рд╕рдВрд╕реНрдХрд░рдг Python-2.6.6-r1 рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рд╕реЗ рдЖрдкрдХреЛ рдЬреЗрдПрд╕ (рдХреНрд░реЛрдо, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдбреАрдмрдЧрд┐рдВрдЧ рдФрд░ рдЖрдкрдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ PyQt IDE рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдореИрдВ рдПрд░рд┐рдХ 4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдЙрджрд╛рд╣рд░рдг 1. рд╡рд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬрд┐рд╕реЗ рд╣рдо рдореЙрдХ рдХрд░реЗрдВрдЧреЗ
# -*- coding: utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtNetwork import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
class BaseBrowser(QWidget):
def __init__(self, parent = None):
super(BaseBrowser, self).__init__(parent)
self.__progress = 0
QNetworkProxyFactory.setUseSystemConfiguration(True)
self.webView = QWebView()
self.webView.load(QUrl( "http://www.yandex.ru" ))
self.connect(self.webView, SIGNAL( "loadFinished(bool)" ), self.adjustLocation)
self.connect(self.webView, SIGNAL( "titleChanged(QString)" ), self.adjustTitle)
self.connect(self.webView, SIGNAL( "loadProgress(int)" ), self.setProgress)
self.connect(self.webView, SIGNAL( "loadFinished(bool)" ), self.finishLoading)
self.locationEdit = QLineEdit()
self.locationEdit.setSizePolicy(QSizePolicy.Expanding, self.locationEdit.sizePolicy().verticalPolicy())
self.connect(self.locationEdit, SIGNAL( "returnPressed()" ), self.changeLocation)
self.goButton = QPushButton( "Go" )
self.connect(self.goButton, SIGNAL( "clicked()" ), self.changeLocation)
self.layout = QGridLayout(self)
self.layout.addWidget(self.locationEdit, 0, 0)
self.layout.addWidget(self.goButton, 0, 1)
self.layout.addWidget(self.webView, 1, 0, 1, 2)
self.setLayout(self.layout)
def adjustLocation(self):
self.locationEdit.setText(self.webView.url().toString())
def changeLocation(self):
url = self.locationEdit.text()
if url[0:7] != 'http://' :
url = 'http://' + url
self.webView.load(QUrl(url))
self.webView.setFocus()
def adjustTitle(self):
if self.__progress <= 0 or self.__progress >= 100:
self.setWindowTitle(self.webView.title())
else :
self.setWindowTitle(QString( "%1 (%2%)" ).arg(self.webView.title()).arg(self.__progress))
def setProgress(self, p):
self.__progress = p
self.adjustTitle()
def finishLoading(self):
self.__progress = 100
self.adjustTitle()
if __name__ == "__main__" :
import sys
app = QApplication(sys.argv)
prog = BaseBrowser()
prog.show()
sys.exit(app.exec_())
* This source code was highlighted with Source Code Highlighter .
рдЙрджрд╛рд╣рд░рдг рдХреЛрдб 1: pastebin.com/GVQ4dw1M
рдмреНрд░рд╛рдЙрдЬрд╝рд░ C ++ / Qt рдФрд░ PyQt рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдХреБрдЫ рднрд┐рдиреНрдирддрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд▓реЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣рдо рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдВрдЧреЗред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЫреЛрдЯреЗ рднреА, рд▓рд┐рдЦрддреЗ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЛрдб рдХреА рд╕рдВрдЦреНрдпрд╛, рдЗрд╕рдХреА рджреГрд╢реНрдпрддрд╛ рдФрд░ рд╕рд╣реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рдХреЛ рд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо QWebView рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЗрд╕ рд╡рд┐рдЬреЗрдЯ рд╕реЗ рдЙрддреНрдкрдиреНрди рдорд╛рдирдХ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕реНрд▓реЙрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╡рд░реНрддрдорд╛рди SIGNAL рд╡реЗрдм рдкреЗрдЬ рдХрд╛ рд╢реАрд░реНрд╖рдХ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ("titleChanged) (QString) "), рд▓реЛрдбрд┐рдВрдЧ SIGNAL рдХреА рдкреНрд░рдЧрддрд┐ (" рд▓реЛрдбрдкреНрд░реЛрдЧреНрд░реЗрд╕ (int) ") рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЕрдВрдд - SIGNAL (" рд▓реЛрдбрдлрд┐рдирд┐рд╢реНрдб (рдмреВрд▓) ")ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рдПрдбреНрд░реЗрд╕ рдФрд░ рдПрдХ рдмрдЯрди рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ QlineEdit рдлрд╝реАрд▓реНрдб рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдпрд╛ рддреЛ "рдПрдВрдЯрд░" рджрдмрд╛рдХрд░ рдпрд╛ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗред
рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо "рдирдЧреНрди" рд╡реЗрдмрдХреАрдЯ рдХреЗ рдХрд╛рдо рдХреА рдЧрддрд┐ рд╕реЗ рднрдпрд╛рдирдХ рд╣реИрдВред рдЕрднреА рддрдХ рд╣рдордиреЗ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг 2. DOM рдкреЗрдбрд╝ рдФрд░ Qt рд╕реЗ рдЙрдирдХреЗ рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, HTML рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рдЧ рд╕реЗ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рджреЛ рд╡рд╛рдХреНрдпреЛрдВ рдореЗрдВ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдСрдлрд╝рд▓рд╛рдЗрди рд╢реЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рддреЛ, рдХреЛрдИ рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдкрдХреЛ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдиреЛрдбреНрд╕ рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдПрдХ рддрддреНрд╡, рд╡рд┐рд╢реЗрд╖рддрд╛, рдкрд╛рда, рдЧреНрд░рд╛рдлрд┐рдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд╕реНрддреБ рд╣реИред рдиреЛрдбреНрд╕ рдЕрднрд┐рднрд╛рд╡рдХ-рдмрд╛рд▓ рд╕рдВрдмрдВрдзреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд╕реНрдкрд░ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ (рд╣рд╛рдВ, рдпрд╣ рд▓рд╛рдЗрди рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рд╣реИ)ред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕ рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЕрдкрдирд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓реЗрдВ рдФрд░ рдПрдХ рд╣реА yandex.ru рдкрд░ рдЬрд╛рдПрдВ (рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ рд╣реЗрдмрд░рдлрд╝реЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ)ред рдЖрдк рд╕рд░реНрдЪ рдмрд╛рд░ рдХреЗ рдКрдкрд░ рдХрд┐рддрдиреЗ рд▓рд┐рдВрдХ рджреЗрдЦрддреЗ рд╣реИрдВ?
рд▓рд┐рдВрдХ рдХреА рд╕реВрдЪреА рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдореЗрдиреВ рдореЗрдВ рдЦреЛрд▓реЗрдВ (рдХреНрд░реЛрдо рдореЗрдВ, рдпрд╣ рд╕рдВрджрд░реНрдн рд╕реВрдЪреА рдореЗрдВ рдПрдХ "рдЪреЗрдХ рдЖрдЗрдЯрдо" рд╣реИ)ред рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреЗрдбрд╝ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рджреЗрдЦреЗрдВрдЧреЗред рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╕реАрдзрд╛ рдЖрдИрдбреА = "рдЯреИрдм" рд╣реИ рдФрд░ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрд╕реЛрд▓ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЪреБрдирдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
document.getElementById("tabs").
рджреЗрдЦрд┐рдП рдЗрд╕рдореЗрдВ рдХрд┐рддрдиреА рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ:
document.getElementById("tabs").rows.length
рдФрд░ рдХрд┐рддрдиреЗ рдХреЙрд▓рдо:
document.getElementById("tabs").rows(0).cells.length.
рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВред
# -*- coding: utf-8 -*-
from basebrowser import *
class SimpleJavaScript(BaseBrowser):
def __init__(self, parent = None):
super(SimpleJavaScript, self).__init__(parent)
self.jsButton = QPushButton( "ExecuteJS" )
self.connect(self.jsButton, SIGNAL( "clicked()" ), self.jsScript)
self.jsStringEdit = QLineEdit()
self.jsStringEdit.setSizePolicy(QSizePolicy.Expanding, self.jsStringEdit.sizePolicy().verticalPolicy())
self.jsStringEdit.setText( "document.getElementById(\"tabs\").rows(0).cells.length" )
self.connect(self.jsStringEdit, SIGNAL( "returnPressed()" ), self.jsScript)
self.jsReturnText = QTextEdit()
self.layout.addWidget(self.jsStringEdit, 2, 0, 1, 1)
self.layout.addWidget(self.jsButton, 2, 1, 1, 1)
self.layout.addWidget(self.jsReturnText, 3, 0, 1, 2)
def jsScript(self):
jsString = self.jsStringEdit.text()
jsReturn = self.webView.page().currentFrame().evaluateJavaScript(jsString)
self.jsReturnText.setPlainText(jsReturn.toString())
if __name__ == "__main__" :
import sys
app = QApplication(sys.argv)
ui = SimpleJavaScript()
ui.show()
sys.exit(app.exec_())
* This source code was highlighted with Source Code Highlighter .
рдЙрджрд╛рд╣рд░рдг рдХреЛрдб 2: pastebin.com/p4P1ZEtS
рддреЛ, JS рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдлрдВрдХреНрд╢рди webView.page () рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред CurrentFrame ()ред EvJJavaScript (jsString) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВред
рдореВрд▓реНрдпрд╛рдВрдХрдиJavaScript (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдпреБрдХреНрдд QString рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдПрдХ QVariant рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдк рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдбреЛрдо рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдкрд╛рда рдпрд╛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА - рдХреГрдкрдпрд╛ред
рдЙрджрд╛рд╣рд░рдг 3. рдСрдлрд╝рд▓рд╛рдЗрди рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдирд╛
рдЗрд╕ рдмрд╛рд░ рд╣реЛрдо рдкреЗрдЬ рдХрд╛ рдкрддрд╛ рдЗрд╕ рддрд░рд╣ рдЪреБрдирд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдЯреАрдЖрдИ рдХрд╛рд░реНрдб рд╣реИ рдФрд░ рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдХреЗ рдиреАрдЪреЗ рдмреИрдард╛ рд╣реВрдВ, рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рд╡рд╣ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдкреНрдпрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЪрдпрди рдЬреИрд╕реЗ рдкреГрд╖реНрда рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рдордХрдХреНрд╖ рдмрдирд╛рдПрдВрдЧреЗред
# -*- coding: utf-8 -*-
from basebrowser import *
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class JSSelectList(QAbstractListModel):
def __init__ (self, _id, _jsFunc, parent = None):
super(JSSelectList, self).__init__(parent)
self.id = _id
self.jsFunc = _jsFunc
def data(self, index, role=Qt.DisplayRole):
if not index.isValid():
return QVariant()
if role == Qt.DisplayRole:
jsstring = QString( "document.getElementById('%1').options[%2].textContent" ).arg(self.id).arg(index.row())
jsreturn = self.jsFunc(jsstring)
return jsreturn.toString().trimmed()
def rowCount(self, index=QModelIndex()):
jsstring = QString( "document.getElementById('%1').length" ).arg(self.id)
jsreturn = self.jsFunc(jsstring)
ok = False
count, ok = jsreturn.toInt()
return count if ok else 0
def headerData(self, section, orientation, role=Qt.DisplayRole):
if role != Qt.DisplayRole:
return QVariant()
else :
return self.id
class JSComboBoxDemo(BaseBrowser):
def __init__(self, parent = None):
super(JSComboBoxDemo, self).__init__(parent)
self.vendorComboBox = QComboBox()
id = QString( "productLine" )
self.vendorListModel = JSSelectList(id, self.webView.page().currentFrame().evaluateJavaScript)
self.vendorComboBox.setModel(self.vendorListModel)
self.connect(self.vendorComboBox, SIGNAL( "currentIndexChanged(int)" ), self.setSelectOnWebPage);
self.connect(self.webView, SIGNAL( "loadFinished(bool)" ), self.initComboBox)
self.layout.addWidget(self.vendorComboBox, 2, 0, 1, 1)
self.webView.load(QUrl( "http://www.amd.com" ))
def setSelectOnWebPage(self, new_id):
jsstring = QString( "document.getElementById('productLine').selectedIndex=%1" ).arg(new_id)
self.webView.page().currentFrame().evaluateJavaScript(jsstring)
def initComboBox(self):
self.vendorComboBox.setCurrentIndex(0)
if __name__ == "__main__" :
import sys
app = QApplication(sys.argv)
ui = JSComboBoxDemo()
ui.show()
sys.exit(app.exec_())
* This source code was highlighted with Source Code Highlighter .
рдЙрджрд╛рд╣рд░рдг рдХреЛрдб 3: pastebin.com/YzA9hL3H
рдПрдХ рддрд╛рд▓рд┐рдХрд╛, рд╕реВрдЪреА, рдбреНрд░реЙрдкрдбрд╛рдЙрди рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реЗ GUI рддрддреНрд╡реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп (рдореИрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛) Qt рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ MVC рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдорд╛рдирдХ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ (рд╕рдорд░рдлреАрд▓реНрдб рдореЗрдВ, рдпрд╣ рдЕрдзреНрдпрд╛рдп 14 рд▓рдЧрддрд╛ рд╣реИ)ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, QAbstractListModel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдХреЗрд╡рд▓ JS рдирд┐рд╖реНрдкрд╛рджрди рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдкреГрд╖реНрда рдкрд░ рдЪрдпрдирд┐рдд рдирд╛рдо рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдкреБрдирд░реНрдирд┐рд░реНрдзрд╛рд░рдг рдорд╛рдирдХреЛрдВред
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рджреЛ рд╕рд┐рдЧреНрдирд▓-рд╕реНрд▓реЙрдЯ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдмреЗрдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВ рдХрд┐ рдЬрдм рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдП, рддреЛ QWebView рд╡рд┐рдЬреЗрдЯ рдПрдХ рд╕рдВрдХреЗрдд ("рд▓реЛрдбрдлрд┐рдирд┐рд╢реНрдб (рдмреВрд▓)") рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
self.connect(self.webView, SIGNAL("loadFinished(bool)"), self.initComboBox)
рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рдЖрдк рд▓рд╛рдЗрди рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддреЗ рд╣реИрдВ
self.vendorComboBox.setCurrentIndex(0)
__init__ рдореЗрдВ рдкрд╣рд▓реЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдореВрд▓реНрдпрд╛рдВрдХрдирдЬрд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреЗрдЬ рдЕрднреА рддрдХ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
рджреВрд╕рд░реЗ, рд╣рдореЗрдВ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
self.connect(self.vendorComboBox, SIGNAL("currentIndexChanged(int)"), self.setSelectOnWebPage)
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдкреГрд╖реНрда рдХреА рд▓рдЧрднрдЧ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╛рдирдХрд╛рд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рд╕рднреА рдХреЛ рдореЗрд░реА рдХреНрд░рд┐рд╕рдорд╕ рдФрд░ рдирдпрд╛ рд╕рд╛рд▓ рдореБрдмрд╛рд░рдХред
рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рд╣рд┐рддреНрдп:
рдЬреЗред рдмреНрд▓реИрдВрдЪреЗрдЯ, рдПрдоред рд╕рдорд░рдлрд╝реАрд▓реНрдбред Qt 4: C ++ GUI рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред
рд╕рдорд░рдлреАрд▓реНрдб рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред рдкрд╛рдпрдерди рдФрд░ рдХреНрдпреВрдЯреА рдХреЗ рд╕рд╛рде рд░реИрдкрд┐рдб рдЬреАрдпреВрдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред
рдЕрдиреНрдп рд╕реНрд░реЛрдд:
Arora рдЗрдВрдЯрд░рдиреЗрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ PyQt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рд╛рдЗрдЯреЗрдВред