質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1610閲覧

PyQtでQWebSettingsを使用したい

Karlfeldt

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/13 07:58

前提・実現したいこと

私は現在、PyQt5を用いて自作のブラウザを作成しています。
その過程で何個か(例えばPrivateBrowsingなど)のQWebSettingsを使用する必要性が出てきました。
そして、私はインターネットで調べた結果を何個か試してみましたがそれはどれもうまくいきませんでした。

発生している問題・エラーメッセージ

NameError: name 'QWebSettings' is not defined

該当のソースコード

python

1from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings 2 3self.webEngineView = QtWebEngineWidgets.QWebEngineView(self.centralwidget) 4 self.webEngineView.page().settings().WebAttribute(QWebSettings.DeveloperExtrasEnabled, True)

これは大体のコードであり、このコードがなければプログラムは正常に動作します

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーの原因: import したのは QWebEngineSettings 利用しているのは QWebSettings

ですが、恐らくサンプルコードを混同されいるので

  • QWebSettings.DeveloperExtrasEnabled は WebKit 用の設定。
  • WebAttribute は enum 型の値で呼び出し自体できません。

解決策: 同樣の設定を QtWebEngineWidgets 用の API で行う必要があります。

参考:

投稿2021/06/13 10:01

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karlfeldt

2021/06/13 10:30 編集

質問を変えさせてもらいます... Googleの開発者ツールのように特定のショートカットを押したら DevToolが起動するようにしたのですが どうすればよいでしょうか... サンプルを見る限りだと self.view.loadFinished.connect(self.handleLoaded) self.view.load(QtCore.QUrl('https://google.com/')) self.inspector = QWebEngineView() self.inspector.setWindowTitle('Web Inspector') self.inspector.load(QtCore.QUrl(DEBUG_URL)) の部分が必要だと思うのですがhttps://google.com/を該当のそのページのURLの変数にするぐらいしか 色々思いつかず、行き詰まってしまったので返信させてもらいました... プログラムガチの初心者で投げやりな質問になってしまい申し訳ないですが 回答いただけると幸いです
teamikl

2021/06/13 10:48

サンプルコードにある通りです。コメントされてる方法で正解です。 inspector の URL は固定で良いので、 デバッグしたい対象のページをview に読み込んで、 ページに対して setDevToolsPage で inspector を指定。 self.view.page().setDevToolsPage(self.inspector) をページの読み込み完了後(loadFinished) に呼び出すようにします。 「特定のショートカットを押したら」の方は、メニューの作り方を調べてみてはどうでしょう。 hints: QShortcut, QKeySequence, QAction 辺りでショートカットキーの設定が出来ます。
Karlfeldt

2021/06/13 11:20

なるほど丁寧に回答ありがとうございます。 最後に現在ショートカット周りをいじっていたのですが from PyQt5 import QtCore, QtWidgets, QtGui from PyQt5.QtGui import QKeySequence from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings import subprocess import sys, os self.shortcut_dev = QShortcut(QKeySequence('Ctrl+D'), self) self.shortcut_dev.activated.connect(self.open_dev) def open_dev(self): self.inspector.show() と組んだところ name QShortcut がありませんとエラーが出しまっています... 度々質問ばかりで申し訳ありません... もしよろしければ回答いただけると幸いです
teamikl

2021/06/13 11:34

インポートの仕方の問題ですね。 from PyQt5 import QtCore, QtWidgets, QtGui の様にインポートした場合は「モジュール」を読み込んでいるので、 その中の「QShortcut クラス」を使う場合には QtWidgets.QShortcut と記述する必要があります。 QKeySequence で行っているように from PyQt5.QtWidgets import QShortcut とインポートすると、 QShortcut(QKeySequence( ... と直接使えます。 import ~の後に書いた名前で使えるようになります。 チュートリアル: モジュールについて https://docs.python.org/ja/3/tutorial/modules.html リファレンス: インポートについて https://docs.python.org/ja/3/reference/import.html
Karlfeldt

2021/06/13 11:53

なるほど、インポート周りでしたか... やってみたら改善できました!!! ただ実行すると今度は赤文字(Error)ではなく、青文字で QShortcut(QWidget): argument 1 has unexpected type 'QKeySequence' QShortcut(Union[QKeySequence, QKeySequence.StandardKey, str, int], QWidget, member: PYQT_SLOT = 0, ambiguousMember: PYQT_SLOT = 0, context: Qt.ShortcutContext = Qt.WindowShortcut): argument 2 has unexpected type 'Ui_MainWindow' とself.shortcut = QShortcut(QKeySequence('Ctrl+D'), self) からログが出ました... 度々質問ばかりで本当に申し訳ありません
teamikl

2021/06/13 12:01

QShortcut(...) の引数が問題みたいですが、 コードの断片だけでは状況が把握しにくいです。 self が何かによって変わってきます。 Ui_MainWindowは、 .ui ファイルから生成したものだと思いますが 大抵の場合このクラスは python の object になってます。 QShortcut では QWidget 型のオブジェクトを要求するので、 第2引数のself のところは、メインウィンドウ等を指定してみて下さい。
Karlfeldt

2021/06/13 12:22

なるほど..一応全文上げさせてもらいます.. from PyQt5 import QtCore, QtWidgets, QtGui from PyQt5.QtGui import QKeySequence from PyQt5.QtWidgets import QShortcut from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings import subprocess import sys, os f = open('setdocument.txt', 'r') Durl = f.readline() f.close() DEBUG_PORT = '5588' DEBUG_URL = 'http://127.0.0.1:%s' % DEBUG_PORT os.environ['QTWEBENGINE_REMOTE_DEBUGGING'] = DEBUG_PORT class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(988, 786) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") self.calendarWidget = QtWidgets.QCalendarWidget(self.centralwidget) self.calendarWidget.setEnabled(True) font = QtGui.QFont() font.setFamily("メイリオ") self.calendarWidget.setFont(font) self.calendarWidget.setLocale(QtCore.QLocale(QtCore.QLocale.Japanese, QtCore.QLocale.Japan)) self.calendarWidget.setObjectName("calendarWidget") self.gridLayout.addWidget(self.calendarWidget, 0, 2, 1, 1) self.calendarWidget.hide() self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.back = QtWidgets.QPushButton(self.centralwidget) self.back.setText("") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/icon/back.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.back.setIcon(icon) self.back.setObjectName("back") self.horizontalLayout.addWidget(self.back) self.reload = QtWidgets.QPushButton(self.centralwidget) self.reload.setText("") icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(":/icon/reload.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.reload.setIcon(icon1) self.reload.setObjectName("reload") self.horizontalLayout.addWidget(self.reload) self.forward = QtWidgets.QPushButton(self.centralwidget) self.forward.setText("") icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(":/icon/forward.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.forward.setIcon(icon2) self.forward.setObjectName("forward") self.horizontalLayout.addWidget(self.forward) self.calendar = QtWidgets.QPushButton(self.centralwidget) self.calendar.setText("") icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(":/icon/calendar.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.calendar.setIcon(icon3) self.calendar.setObjectName("calendar") self.horizontalLayout.addWidget(self.calendar) self.timer = QtWidgets.QPushButton(self.centralwidget) self.timer.setText("") icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(":/icon/stopwatch.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.timer.setIcon(icon4) self.timer.setObjectName("timer") self.horizontalLayout.addWidget(self.timer) self.verticalLayout.addLayout(self.horizontalLayout) self.webEngineView = QtWebEngineWidgets.QWebEngineView(self.centralwidget) self.webEngineView.page().settings().setAttribute(QWebEngineSettings.PluginsEnabled, True) self.webEngineView.page().settings().setAttribute(QWebEngineSettings.PluginsEnabled, True) self.webEngineView.page().settings().setAttribute(QWebEngineSettings.PdfViewerEnabled, True) self.webEngineView.page().settings().setAttribute(QWebEngineSettings.PluginsEnabled, True) self.webEngineView.page().settings().setAttribute(QWebEngineSettings.PdfViewerEnabled, True) self.webEngineView.page().settings().setAttribute(QWebEngineSettings.DnsPrefetchEnabled, True) self.webEngineView.page().settings().setAttribute(QWebEngineSettings.AllowRunningInsecureContent, True) self.webEngineView.page().settings().setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True) self.webEngineView.setUrl(QtCore.QUrl("{}".format(Durl))) self.inspector = QWebEngineView() self.inspector.setWindowTitle('Web Inspector') self.inspector.load(QtCore.QUrl(DEBUG_URL)) self.webEngineView.page().setDevToolsPage(self.inspector.page()) self.shortcut = QShortcut(QKeySequence('Ctrl+D'), self) self.shortcut_dev.activated.connect(self.open_dev) self.webEngineView.setObjectName("webEngineView") self.verticalLayout.addWidget(self.webEngineView) self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setEnabled(False) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.back.clicked.connect(self.webEngineView.back) self.reload.clicked.connect(self.webEngineView.reload) self.forward.clicked.connect(self.webEngineView.forward) self.calendar.pressed.connect(self.calendarWidget.show) self.calendar.clicked.connect(self.calendarWidget.hide) self.timer.clicked.connect(self.FuncName) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("BonFire", "BonFire")) def FuncName(self): subprocess.Popen(r'app/timer.exe') def open_dev(self): self.inspector.show() from PyQt5 import QtWebEngineWidgets import Picture_rc こんな感じです
teamikl

2021/06/13 12:45

>第2引数のself のところは、メインウィンドウ等を指定してみて下さい。
Karlfeldt

2021/06/13 13:54

出来ました!! self.webEngineView.page().setDevToolsPage(self.inspector.page()) self.shortcut = QShortcut(QKeySequence('Ctrl+D'), MainWindow) self.shortcut.activated.connect(self.open_dev) self.webEngineView.setObjectName("webEngineView") とやったら最終的に行けました!本当にありがとうございます!! わざわざ全部の質問に丁寧に回答本当にありがとうございます!!
teamikl

2021/06/13 15:53

後、一点気になったのですが、class Ui_MainWindow(object): があるファイルは QtDesigner で作って .ui ファイルから変換したものでは有りませんか? ui ファイルから生成された py ファイルを直接編集すると、 後々 QtDesigner で再編集したい時に困らないかな。 もし、再編集する場合は、独自の機能を追加したりするのは、setupUi 内ではなく Ui_MainWindowを利用する側(別ファイル)で、行うように検討してみて下さい。
Karlfeldt

2021/06/14 13:29

なるほど!アドバイス有難うございます!そうしてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問