47873


**経緯**  
自作アプリを使っているうちに、インターネットをちらちら確認しながら作業するのは、GUIの移動が面倒で、頭が痛くなって疲れてきますから、自分のアプリそのものにインターネットブラウザを取り付けてしまえ。と思うようになりました。仮に他ユーザーの立場からしても、そうした方が楽だと思うので、一石二鳥だと考えました。その方法を探したところ、`Qt`には、`QtWebKit`というモジュールがあります。ネットを方々探索するのですが、中々これを取り扱ったソースコードもなく、自分は`Web`系の知識が乏しいものでして、どうにかこういうものを作りました。[ほぼここをpython化しました。](https://gihyo.jp/dev/feature/01/qt/0006?page=3)
このコードを実行していただければお分かりいただけると思うのですが、インターネットでは、`png`画像のみ表示ができ、動画は全く見れません。  
フラッシュ画面なども移りません。`http:\\\youtube.com`とか、yahooに入っていただくと絵が欲しいと思われると思います。  
**質問**  
`png`以外の画像や、動画を見るためには、どうすればいいのでしょうか？

**ぼやき**  
自分で使うようなら、自分が気に入っているサイトのアドレスを全部リスト化してお気に入り状態をはじめから作ればいいだろうとは思いますが。コンボボックスなどに、気になるようなら加えて、それをsetUrl()すれば楽勝だとは思います。プログラミング的にWebの世界はあまり興味がないうえ、難しいイメージがあるため敬遠していました。それとプラグインです。プラグインを取り付けた成功体験がないため、よくわからないです。qJPEG.dllやqgif.dllが必要だとか見たことはあるのですが。

[code]

    from PySide import QtGui
    from PySide import QtCore
    import sys
    from PySide import QtWebKit
    class WebMainWindow(QtGui.QMainWindow):
        def __init__(self,parent=None):
            super(WebMainWindow,self).__init__(parent=None)
            self.webView = QtWebKit.QWebView()
            self.webView.load(QtCore.QUrl("http://www.wikipedia.org/"))  
    
            self.setCentralWidget(self.webView)
    
            self.progress = QtGui.QProgressBar()
            self.progress.setRange( 0, 100 )
            self.progress.setMinimumSize( 100, 20 )
            self.progress.setSizePolicy( QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum )
            self.progress.hide()
            self.statusBar().addPermanentWidget( self.progress )
    
            self.connect( self.webView, QtCore.SIGNAL( "loadProgress( int )" ), self.progress, QtCore.SLOT( "show()" ) )
            self.connect( self.webView, QtCore.SIGNAL( "loadProgress( int )" ), self.progress, QtCore.SLOT( "setValue( int )" ) )
            self.connect( self.webView, QtCore.SIGNAL( "loadFinished( bool )"), self.progress, QtCore.SLOT( "hide()" ) )
    
            self.urlEdit = QtGui.QLineEdit()
            self.urlEdit.setSizePolicy( QtGui.QSizePolicy.Expanding, self.urlEdit.sizePolicy().verticalPolicy() )
            self.connect(self.urlEdit,QtCore.SIGNAL( "returnPressed()" ), QtCore.SLOT( "changeLocation" ) )
    
    
            self.bar = QtGui.QToolBar()
            self.addToolBar( self.bar )
            self.bar.setMovable( False )
            self.bar.addAction( self.webView.pageAction( QtWebKit.QWebPage.Back ) )
            self.bar.addAction( self.webView.pageAction( QtWebKit.QWebPage.Forward ) )
            self.bar.addAction( self.webView.pageAction( QtWebKit.QWebPage.Reload ) )
            self.bar.addAction( self.webView.pageAction( QtWebKit.QWebPage.Stop ) )
            self.bar.addWidget( self.urlEdit )
    
            self.fileMenu = self.menuBar().addMenu( "&File" )
    
            self.fileMenu.addAction( "Quit", QtGui.QApplication, QtCore.SLOT("quit()") )
    
            self.connect( self.webView, QtCore.SIGNAL("loadFinished(bool)"),
                  self, QtCore.SLOT("loadFinished()"))
            self.connect( self.webView, QtCore.SIGNAL("titleChanged(str)"),
                  self, QtCore.SLOT("setWindowTitle( str )"))
            self.connect(self.webView.page(),QtCore.SIGNAL("linkHovered(str,str,str)"),
                self, QtCore.SLOT("showLinkHover( str )"))
        def changeLocation(self):
    
            self.url_text = self.urlEdit.text()
            self.urlEdit.setText(self.url_text)
            self.webView.setUrl(self.url_text)
            self.webView.setFocus(QtCore.Qt.FocusReason.OtherFocusReason)
        def loadFinished(self):
            self.urlEdit.setText(self.webView.url().toString())
        def showLinkHover(self,link):
            if  link.isEmpty():
                self.statusBar().clearMessage()
            else:
                self.statusBar().showMessage(  "Open {0}".format( link ))
    
    
    def main():
    
    
        try:
            QtGui.QApplication(sys.argv)
        except Exception as e:
            print(69,e)
    
        websettings = QtWebKit.QWebSettings.globalSettings()
        websettings.setAttribute(QtWebKit.QWebSettings.PluginsEnabled,True)
        mainwindow = WebMainWindow()
        mainwindow.show()
    
        sys.exit(QtGui.QApplication.exec_())
    if __name__ == "__main__":
        main()
    
[/code]


CC BY-SA 4.0
2018-08-27T12:10:29.173
47854
2018-10-05T06:30:05.520
2018-10-05T06:30:05.520
19110
24284
question
python network pyside
QtWebKitで画像や動画を見られるようにするには？


動画の再生方法はまだわからないのですが、`jpeg`画像と`gif`画像を表示する方法を見付けました。

[code]

    QtCore.QCoreApplication.addLibraryPath("C:\\Anaconda3\\Lib\\site-packages\\PySide\\plugins"))
    
[/code]

これを、`QtGui.QApplication(sys.argv)`よりも前に入れ込みます。  
すると、プラグインがロードされて、`jpeg`画像と`gif`画像が表示されるようになりました。

これを使用する前段階としては、

[code]

    self.view.settings().setAttribute(QtWebKit.QWebSettings.PluginsEnabled, True)
    self.view.settings().setAttribute(QtWebKit.QWebSettings.AutoLoadImages,True)
    
[/code]

として、プラグインと、イメージのロードの二つを表示できるようにしておかなくてはなりません。なお、`png`ファイル以外が表示されないと質問文には書きましたが、`svg`画像はもともと表示されていたみたいです。

いずれにせよこれにより、wikipediaの画面は随分と見栄えがよくなりました。個人で使うには十分です。

なお、本家より、このような答えはちらほら見かけたのですが、私は余計な事をしていました。  
というのは、上記のライブラリパスにあるプラグインフォルダを、自分のコードがあるところまで引っ張ってきて、パスを通そうとしていたため、何の効果もありませんでした。

どうやら、`Qt`が **インストールされているフォルダでなければ、効果はないようです。**  
そのため、作業ディレクトリではなくて、オリジナルディレクトリで指定することで妥協しました。

`HTML5`だと、タグに`video`タグが存在しているため、これを利用すれば、`video`の埋め込みや、ストリーミングも可能なのではないか？と考えましたが、私は`HTML`の記法にはまだ疎く、確実にできるかできないかが分かったものではありません。しかし、`QtWebKit`は、その`QWebSettings`[のドキュメンテーション](http://pyside.github.io/docs/pyside/PySide/QtWebKit/QWebSettings.html?highlight=pyside.qtwebkit.qwebsettings#PySide.QtWebKit.PySide.QtWebKit.QWebSettings.testAttribute)にあるように、`HTML5`を導入していることは確かなように思えます。

これを利用する方法が一つ、そして、`phonon`とのタイアップ(`C++`系の情報が主でしたので、あまり理解できませんでした。)等の可能性がありますが、まだ、再生はできていません。  
ですので、これが出来る方法をご存知の方はご教授ください。

**追記**  
パソコンを換えたら、`pluginsライブラリ`の場所も変わっていたので、インタープリタでは、やっかいです。"C:\Anaconda3\Lib\site-
packages\PySide\plugins"ではだめで、  
usr\以下に存在しましたので、引数を変える必要に迫られました。こういうのを防ぐのにいい方法はないかなと思っていますが・・・。

いずれにせよ、プラグインの`dll`ファイルが入っている場所は、  
`plugins\\\imageformats\\\~.dll`と普通はなっていると思いますが、  
**pluginsのところで、パス指定を止めなければ、絵が出てくる事はありません。**

プラグインの導入に成功すると、`QtGui.QImageFormat.supportedImageFormats()`の内容が変化します。

[code]

    PySide.QtCore.QByteArray('bmp'), PySide.QtCore.QByteArray('pbm'),
    PySide.QtCore.QByteArray('pgm'), PySide.QtCore.QByteArray('png'),
    PySide.QtCore.QByteArray('ppm'), PySide.QtCore.QByteArray('xbm'),
    PySide.QtCore.QByteArray('xpm')
    
[/code]

から、

[code]

    PySide.QtCore.QByteArray('bmp'), PySide.QtCore.QByteArray('gif'),
    PySide.QtCore.QByteArray('ico'), PySide.QtCore.QByteArray('jpeg'),
    PySide.QtCore.QByteArray('jpg'), PySide.QtCore.QByteArray('mng'),
    PySide.QtCore.QByteArray('pbm'), PySide.QtCore.QByteArray('pgm'),
    PySide.QtCore.QByteArray('png'), PySide.QtCore.QByteArray('ppm'),
    PySide.QtCore.QByteArray('tga'), PySide.QtCore.QByteArray('tif'),
    PySide.QtCore.QByteArray('tiff'), PySide.QtCore.QByteArray('xbm'),
    PySide.QtCore.QByteArray('xpm')
    
[/code]

になります。  
  
動画の写し方が判明すればまた更新します。  
（追記）  
まだわかりませんが、参考になりそうなところがあったのでUP。

[YouTube View Example](http://doc.qt.io/archives/qt-5.5/qtwebkitexamples-
webkitqml-youtubeview-example.html)

[qtwebkit](/questions/tagged/qtwebkit "'qtwebkit'
のタグが付いた質問を表示")で作成されたブラウザ。高機能？  
[QtWeb browser](http://www.qtweb.net/download.html)

ユーチューブでは何も見れませんでした。  
反応が自分のコードと同じ。ひょっとするとビデオストリーム機能はないのだろうか。

このブログに、同じように苦悩した方の記録があります。

[Enthought Blog](http://blog.enthought.com/open-source/fun-with-qtwebkit-
html5-video/#.W4Vaf_ZuJ1M)

ちなみに、このサイトにある、  
url "<http://camendesign.com/code/video_for_everybody/test.html>"

に飛ぶと、テストビデオページに行けますが、何も映りませんでした。

もしこういうのを見てピンと来られた方がいらっしゃったら何か教えてください。  
(普通の`PySide`だったら無理。と言われてももういいです。ググってもぜんぜん話題になっていないところを見ると、見られないんだろうと感じています。）

**Bad End**  
[qt4.7.4](/questions/tagged/qt4.7.4 "'qt4.7.4'
のタグが付いた質問を表示")系であれば、Videoが利用可能であったのにもかかわらず、[qt4.8](/questions/tagged/qt4.8
"'qt4.8' のタグが付いた質問を表示")系で、Videoが不可能になったという報告がなされています。  
[QTBUG Report 22883](https://bugreports.qt.io/browse/QTBUG-22883)

誠に残念な結果ですが、何ら解決策は見つからず、同じエラーが治ったという文献は見当たらないため、ビデオは利用不可能という結論に達しました。ちくちくと探しつつ別のことに集中します。ありがとうございました。

**Fork End QtWebEngineに切り替える。**  
[QtWebEngine Features](https://doc.qt.io/qt-5/qtwebengine-features.html#audio-
and-video-codecs)  
[pyside2](/questions/tagged/pyside2 "'pyside2'
のタグが付いた質問を表示"),[pyqt5](/questions/tagged/pyqt5 "'pyqt5'
のタグが付いた質問を表示")になってしまいますが、`QtWebEngine`に移行すれば、できる話のようです。  
[pyside](/questions/tagged/pyside "'pyside'
のタグが付いた質問を表示")に止まる理由が強くない限り、移動するのがいいです。  
（追記）  
[pyqt5](/questions/tagged/pyqt5 "'pyqt5'
のタグが付いた質問を表示"),[pyside2](/questions/tagged/pyside2 "'pyside2'
のタグが付いた質問を表示")は、まだ[qt](/questions/tagged/qt "'qt'
のタグが付いた質問を表示")に引き直すと[qt5.6](/questions/tagged/qt5.6 "'qt5.6'
のタグが付いた質問を表示")だそうで、いまだに[qtwebkit](/questions/tagged/qtwebkit "'qtwebkit'
のタグが付いた質問を表示")を利用しています。[qtwebengine](/questions/tagged/qtwebengine
"'qtwebengine'
のタグが付いた質問を表示")だと動画が写ることが確認とれました。[qt5.9.6](/questions/tagged/qt5.9.6 "'qt5.9.6'
のタグが付いた質問を表示")で確認しました。そのため、[pyside2](/questions/tagged/pyside2 "'pyside2'
のタグが付いた質問を表示")や、[pyqt5](/questions/tagged/pyqt5 "'pyqt5'
のタグが付いた質問を表示")でも、まだ動画を見る事は不可能のようです。もう少し時間が立つのを待ちましょう。


CC BY-SA 4.0
2018-08-28T05:51:34.310
47873
2018-09-23T02:47:22.040
2018-09-23T02:47:22.040
24284
24284
47854
answer