Как показать карту Google в моем Qt Gui с помощью PyQt5.QWebkitWidgets - PullRequest
1 голос
/ 10 июля 2020

Я сейчас пытаюсь встроить карту Google в PyQt5 на основе GUI. Моя среда включает Ubuntu 16.04 LTS и python 2.7.

По сути, я пытаюсь объединить следующие два сценария python (map.py и gui .py) в один сценарий (gui .py), и я был бы признателен, если бы кто-нибудь пролил свет на эту проблему.

picture_map

картинка_ gui

picture_combined

--------------------------------- < map.py > -----------------------------------
#!/usr/bin/env python
# Google Maps JavaScript API:
# https://developers.google.com/maps/documentation/javascript/tutorial

import sys, os
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebKitWidgets import QWebView


app = QApplication(sys.argv)

web = QWebView()
web.settings().setAttribute(QWebSettings.JavascriptEnabled, True)
tempPath = "file:///" + os.path.join(os.getcwd(), "map.html").replace('\\','/')

web.load(QUrl(tempPath))
web.show()

sys.exit(app.exec_())
--------------------------------- < gui.py > -----------------------------------
#!/usr/bin/env python

import sys, time, subprocess, os
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtWidgets

class Cmd:
    def sensor_start(self):
        print('Sensor Start button click')
        subprocess.Popen("exec " + "python remotedata.py", shell=True)

    def sensor_end(self):
        print('Sensor End button click')
    subprocess.Popen("pkill -f remotedata.py",shell=True)

    def mission_start(self):
        print('Mission Start button click')
        subprocess.Popen("rosrun mavros mavsafety arm",shell=True)
        time.sleep(1)
        subprocess.Popen("rosrun mavros mavsys mode -c OFFBOARD",shell=True)

    def mission_end(self):
        print('Mission End button click')
        subprocess.Popen("rosrun mavros mavsys mode -c AUTO.RTL",shell=True)

    def mission_hold(self):
        print('Mission Hold button click')
        subprocess.Popen("rosrun mavros mavsys mode -c AUTO.LOITER",shell=True)


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

    self.setMinimumSize(QSize(1280,800))
        self.setWindowTitle("Ocean Exploration UAV")
        self.statusBar().showMessage('Copyright 2020 www.uaslaboratory.com. All rights reserved.')

    # SENSOR
        self.nameLabel0 = QLabel(self)
        self.nameLabel0.setText('Sensor:')
        self.nameLabel0.move(20, 20)

    # MISSION
        self.nameLabel1 = QLabel(self)
        self.nameLabel1.setText('Mission:')
        self.nameLabel1.move(20, 50)

    # SENSOR: Start Data Logging
        button = QPushButton('Start', self)
        button.setToolTip('Start data logging')
        button.move(90,20)
        button.clicked.connect(cmd.sensor_start)

        # SENSOR: Start Data Logging
        button = QPushButton('End', self)
        button.setToolTip('End data logging')
        button.move(190,20)
        button.clicked.connect(cmd.sensor_end)

    # MISSION: Start Mission
        button = QPushButton('Start', self)
        button.setToolTip('Start UAV mission')
        button.move(90,50)
        button.clicked.connect(cmd.mission_start)

    # MISSION: End Mission
        button = QPushButton('End', self)
        button.setToolTip('End UAV mission')
        button.move(190,50)
        button.clicked.connect(cmd.mission_end)

    # MISSION: Hold Mission
        button = QPushButton('Hold', self)
        button.setToolTip('Hold UAV mission')
        button.move(290,50)
        button.clicked.connect(cmd.mission_hold)

    self.show()

if __name__ == "__main__":
    cmd = Cmd()

    app = QtWidgets.QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()

    sys.exit(app.exec_())
    time.sleep(5)

1 Ответ

0 голосов
/ 10 июля 2020

Вам просто нужно поместить QWebView, который является виджетом. Для управления позицией использую qlayouts:

import os
import subprocess
import sys
from PyQt5.QtCore import QSize, QUrl
from PyQt5.QtWidgets import (
    QApplication,
    QLabel,
    QMainWindow,
    QPushButton,
    QWidget,
    QGridLayout,
)
from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtWebKitWidgets import QWebView


CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))


class Cmd:
    def sensor_start(self):
        print("Sensor Start button click")
        subprocess.Popen("exec " + "python remotedata.py", shell=True)

    def sensor_end(self):
        print("Sensor End button click")

    subprocess.Popen("pkill -f remotedata.py", shell=True)

    def mission_start(self):
        print("Mission Start button click")
        subprocess.Popen("rosrun mavros mavsafety arm", shell=True)
        time.sleep(1)
        subprocess.Popen("rosrun mavros mavsys mode -c OFFBOARD", shell=True)

    def mission_end(self):
        print("Mission End button click")
        subprocess.Popen("rosrun mavros mavsys mode -c AUTO.RTL", shell=True)

    def mission_hold(self):
        print("Mission Hold button click")
        subprocess.Popen("rosrun mavros mavsys mode -c AUTO.LOITER", shell=True)


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMinimumSize(QSize(1280, 800))
        self.setWindowTitle("Ocean Exploration UAV")
        self.statusBar().showMessage(
            "Copyright 2020 www.uaslaboratory.com. All rights reserved."
        )

        # SENSOR
        self.nameLabel0 = QLabel("Sensor:")

        # MISSION
        self.nameLabel1 = QLabel("Mission:")

        # SENSOR: Start Data Logging
        button_start_logging = QPushButton("Start", toolTip="Start data logging")
        button_start_logging.clicked.connect(cmd.sensor_start)

        # SENSOR: Start Data Logging
        button_end_logging = QPushButton("End", toolTip="End data logging")
        button_end_logging.clicked.connect(cmd.sensor_end)

        # MISSION: Start Mission
        button_start_uav = QPushButton("Start", toolTip="Start UAV mission")
        button_start_uav.clicked.connect(cmd.mission_start)

        # MISSION: End Mission
        button_end_uav = QPushButton("End", toolTip="End UAV mission")
        button_end_uav.clicked.connect(cmd.mission_end)

        # MISSION: Hold Mission
        button_hold_uav = QPushButton("Hold", toolTip="Hold UAV mission")
        button_hold_uav.clicked.connect(cmd.mission_hold)

        web = QWebView()
        web.settings().setAttribute(QWebSettings.JavascriptEnabled, True)

        filename = os.path.join(CURRENT_DIR, "map.html")
        url = QUrl.fromLocalFile(filename)
        web.load(url)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        lay = QGridLayout(central_widget)
        lay.addWidget(self.nameLabel0, 0, 0)
        lay.addWidget(button_start_logging, 0, 1)
        lay.addWidget(button_end_logging, 0, 2)
        lay.addWidget(self.nameLabel1, 1, 0)
        lay.addWidget(button_start_uav, 1, 1)
        lay.addWidget(button_end_uav, 1, 2)
        lay.addWidget(button_hold_uav, 1, 3)
        lay.addWidget(web, 2, 0, 1, 5)
        lay.setColumnStretch(4, 1)


if __name__ == "__main__":
    cmd = Cmd()

    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()

    sys.exit(app.exec_())
    time.sleep(5)
...