一半君的总结纸

听话只听一半君

使用半自动build script编译PyQt 5.8.2 for Maya 2017 update 3 with QtWebkit and QtWebEngine

上次lz没有编译到qwebkit,这次…

预先准备好

编译QtWebKit需要的

  • SQLite 3, 下载 C source code as an amalgamation并设置到SQLITE3SRCDIR环境变量里
  • 其他

      把各种软件装好,autodesk下载来的qt解开,注意从qt 5.6开始,qtwebkit被移除了,所以解开后qtwebkit是一个单独的压缩包,再次解开他,之后你的目录看起来是这样的

      $ tree -L 2
      .
      ├── buildAll.bat
      ├── webkit.bat
      ├── icu.bat
      ├── pyqt.bat
      ├── qscintilla.bat
      ├── qt.bat
      ├── setup.bat
      ├── sip.bat
      ├── icu
      ├── PyQt5_gpl-5.8.2
      ├── QScintilla_gpl-2.10
      ├── Qt
      │   ├── adsk-patches-561.tgz
      │   ├── adsk-qt561-patch.txt
      │   ├── BuildQt561-VS2012.cmd
      │   ├── BuildQt561-VS2015.cmd
      │   ├── howToBuildQtOnLinux_m2017.txt
      │   ├── howToBuildQtOnMac_m2017.txt
      │   ├── howToBuildQtOnWindows_m2017.txt
      │   ├── qt561-webkit.tgz
      │   ├── qt-adsk-5.6.1
      │   ├── qt-adsk-5.6.1.tgz
      │   └── qtwebkit
      ├── sip-4.19.2
      ├── sqlite
      │   ├── shell.c
      │   ├── sqlite3.c
      │   ├── sqlite3.h
      │   └── sqlite3ext.h
      └── tools
          ├── jom.exe
          ├── win_bison.exe
          └── win_flex.exe
      
      
    • lz把自动build script放在了https://github.com/oglops/Maya-PyQt-Scripts
      首先编辑setup.bat设置各软件版本号,然后运行他以设置环境变量,然后依次编译 icu, qt(其中包含了qwebengine), qtwebkit, pyqt, qscintilla. 其中qt约3.5小时(包括qwebengine), qtwebkit约1.5小时, lz机器是低配thinkpad t450s, i5 5200U, 12G 内存

      qtwebkit编译好之后,在编译pyqt之前,要把Qt\qtwebkit\WebKitBuild\Release\Tools\qmake\mkspecs下的内容复制到Qt\qt-adsk-5.6.1\qtbase\mkspecs下

    • 当然这样编译出来的pyqt直接是用不了的,除非你还在运行过setup.bat的console里,因为里面有那些环境变量。 因为pyqt.bat里最后有jom install,所以pyqt5本身是被安装到python安装目录下的Lib\site-packages\PyQt5里面了的,但是Qt的dll以及很多其他文件都没被拷过去,所以

      qt的dll们都在Qt\qt-adsk-5.6.1\qtbase\bin下,因为这是in source build, lz的qt.bat里configure的时候没用–prefix

      # 如果用中古的xcopy命令
      for %I in (*.exe *.dll ) do xcopy %I d:\tmp\pyqt5 /I /EXCLUDE:exclude.txt
      

      此文件里放不想被xcopy复制的文件,每行一种

      *d.dll
      

      或者用现代的命令

      robocopy *.exe *.dll . c:\python27\Lib\site-packages\PyQt5 /xf *d.dll
      

      而QtWebKit的dll们都在 Qt\qtwebkit\WebKitBuild\Release\bin下,所以同样使用上述命令来复制过去
      其他要复制的有
      icu 目录下的 lib 下的一些dll们
      QScintilla 目录下的 lib 下的一些dll们
      qtbase\plugins下文件夹们里的dll们
      qtbase\translations文件夹
      qtbase\resources文件夹

      此外,需要在python.exe所在文件夹里有

      [Paths]
      Prefix = Lib/site-packages/PyQt5
      Binaries = Lib/site-packages/PyQt5
      

      在Lib/site-packages/PyQt5里有

      [Paths]
      Prefix = .
      Binaries = .
      

      此外要新建

      @python.exe -m PyQt5.uic.pyuic %1 %2 %3 %4 %5 %6 %7 %8 %9
      
      @python.exe -m PyQt5.pyrcc_main %1 %2 %3 %4 %5 %6 %7 %8 %9
      
      
      @python.exe -m PyQt5.pylupdate_main %1 %2 %3 %4 %5 %6 %7 %8 %9
      

      等等,也许还有其他遗漏
      最后测试QWebEngine的时候还看到了错误提示

      Could not find QtWebEngineProcess.exe"
      

      根据官网邮件列表说明,”I think your particular problem is a Qt bug. You can try setting the QTWEBENGINEPROCESS_PATH environment variable to the full pathname of the .exe.

      Phil”

      所以只要加个环境变量应该就可以了

      QTWEBENGINEPROCESS_PATH=C:\Python27\Lib\site-packages\PyQt5\QtWebEngineProcess.exe
      

      此外发现看视频网站时console出现错误提示

      defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer"
      

      经查看qtmultimedia下的config.log, directshow 和 wmf plugin没有编译,所以

      cd Qt\qt-adsk-5.6.1\qtmultimedia\src\plugins\directshow
      qmake directshow.pro -o Makefile
      jom -j4
      

      同样编译wmf plugin,然后将qtbase\plugins\mediaservice下新生成的dll复制到python安装目录下的PyQt5\plugins\mediaservice,上述错误消失

    • 按上面的说法手动操作非常麻烦,lz使用从pyqt5.6的源码里拿出来的.nsi script改了改,把上述所需的麻烦的操作做了个安装包,下载链接见文末,效果和riverbank官网从前提供的windows安装包类似,带范例文件

      import sys
      from PyQt5.QtWidgets import QApplication, QWidget
      
      
      if __name__ == '__main__':
      
          app = QApplication(sys.argv)
      
          w = QWidget()
          w.resize(250, 150)
          w.move(300, 300)
          w.setWindowTitle('Simple')
          w.show()
      
          sys.exit(app.exec_())
      
      
      #!/usr/bin/python
      
      import PyQt5
      from PyQt5.QtCore import QUrl
      from PyQt5.QtWidgets import QApplication, QWidget
      from PyQt5.QtWebKitWidgets import QWebView, QWebPage
      from PyQt5.QtWebKit import QWebSettings
      from PyQt5.QtNetwork import *
      import sys
      from optparse import OptionParser
      
      
      class MyBrowser(QWebPage):
          ''' Settings for the browser.'''
      
          def userAgentForUrl(self, url):
              ''' Returns a User Agent that will be seen by the website. '''
              return "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
      
          def javaScriptConsoleMessage(self, message, lineNumber, sourceID):
              # print '-->', message, lineNumber, sourceID
              pass
      
      
      class Browser(QWebView):
      
          def __init__(self):
              QWebView.__init__(self)
              self.setPage(MyBrowser())
              self.setWindowTitle('Loading...')
              self.titleChanged.connect(self.adjustTitle)
      
          def load(self, url):
              self.setUrl(QUrl(url))
      
          def adjustTitle(self):
              self.setWindowTitle(self.title())
      
          def disableJS(self):
              settings = QWebSettings.globalSettings()
              settings.setAttribute(QWebSettings.JavascriptEnabled, False)
      
      
      app = QApplication(sys.argv)
      view = Browser()
      view.show()
      view.load("http://javfor.me/")
      app.exec_()
      
      
      import sys
      
      from PyQt5.QtWebEngineWidgets import QWebEngineView
      from PyQt5.QtWidgets import QApplication
      from PyQt5.QtCore import QUrl
      
      app = QApplication(sys.argv)
      
      browser = QWebEngineView()
      browser.load(QUrl('https://avgle.com'))
      browser.show()
      
      app.exec_()
      

    下载链接:(dropbox)
    PyQt5-5.8.2-gpl-Py2.7-Qt5.6.1-x64.exe

    参考:
    How to build PyQt5 for Autodesk Maya 2017 64bit
    Build Instructions for the QtWebKit build on Windows
    [SOLVED] QtMultimedia : defaultServiceProvider::requestService(): no service found for – “org.qt-project.qt.mediaplayer”

    Advertisements

    发表评论

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / 更改 )

    Twitter picture

    You are commenting using your Twitter account. Log Out / 更改 )

    Facebook photo

    You are commenting using your Facebook account. Log Out / 更改 )

    Google+ photo

    You are commenting using your Google+ account. Log Out / 更改 )

    Connecting to %s

    %d 博主赞过: