首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QWizardPage中的字段上创建按钮

如何在QWizardPage中的字段上创建按钮
EN

Stack Overflow用户
提问于 2021-06-24 03:38:14
回答 1查看 42关注 0票数 0

我试图在QWizardPage中创建一个字段,用户可以单击该字段并打开一个弹出窗口(这将是一个带有地图的窗口,允许用户选择2个坐标),或者允许用户自己输入坐标。想像一下文件选择器行,用户可以打开弹出的文件浏览器,也可以手动输入文件路径。

最初的命令是QLineEdit。

EN

回答 1

Stack Overflow用户

发布于 2021-06-24 04:47:33

除了一个允许显示地图的按钮(例如,使用QDoubleSpinBox )之外,您还必须创建一个自定义小部件,例如显示一个纬度的QDoubleSpinBox和另一个经度的QML。然后,像其他任何小部件一样将小部件添加到QWizardPage中。

代码语言:javascript
复制
import os
import sys
from pathlib import Path

from PySide2.QtCore import Property, Signal, Slot, Qt, QUrl
from PySide2.QtWidgets import (
    QApplication,
    QDialog,
    QDialogButtonBox,
    QDoubleSpinBox,
    QHBoxLayout,
    QLabel,
    QToolButton,
    QVBoxLayout,
    QWidget,
    QWizard,
    QWizardPage,
)
from PyQt5.QtPositioning import QGeoCoordinate
from PyQt5.QtQuickWidgets import QQuickWidget

CURRENT_DIRECTORY = Path(__file__).resolve().parent


class MapDialog(QDialog):
    def __init__(self, geo_widget):
        super().__init__(geo_widget)
        self.setWindowTitle("Map")
        self.map_widget = QQuickWidget(resizeMode=QQuickWidget.SizeRootObjectToView)
        self.map_widget.rootContext().setContextProperty("controller", geo_widget)
        filename = os.fspath(CURRENT_DIRECTORY / "main.qml")
        url = QUrl.fromLocalFile(filename)
        self.map_widget.setSource(url)

        button_box = QDialogButtonBox()
        button_box.setOrientation(Qt.Horizontal)
        button_box.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)

        lay = QVBoxLayout(self)
        lay.addWidget(self.map_widget)
        lay.addWidget(button_box)

        button_box.accepted.connect(self.accept)
        button_box.rejected.connect(self.reject)


class GeoWidget(QWidget):
    coordinate_changed = Signal(name="coordinateChanged")

    def __init__(self, parent=None):
        super().__init__(parent)
        self._coordinate = QGeoCoordinate(0, 0)

        self._lat_spinbox = QDoubleSpinBox(
            minimum=-90.0, maximum=90.0, valueChanged=self.handle_value_changed
        )
        self._lng_spinbox = QDoubleSpinBox(
            minimum=-180.0, maximum=180.0, valueChanged=self.handle_value_changed
        )
        self.btn = QToolButton(text="map", clicked=self.handle_clicked)
        self.map_view = MapDialog(self)

        lay = QHBoxLayout(self)
        lay.addWidget(QLabel("Latitude:"))
        lay.addWidget(self._lat_spinbox)
        lay.addWidget(QLabel("Longitude:"))
        lay.addWidget(self._lng_spinbox)
        lay.addWidget(self.btn)

    @Property(QGeoCoordinate, notify=coordinate_changed)
    def coordinate(self):
        return self._coordinate

    @coordinate.setter
    def coordinate(self, coordinate):
        if self.coordinate == coordinate:
            return
        self._coordinate = coordinate
        self.coordinate_changed.emit()

    def handle_value_changed(self):
        coordinate = QGeoCoordinate(
            self._lat_spinbox.value(), self._lng_spinbox.value()
        )
        self.coordinate = coordinate

    @Slot(QGeoCoordinate)
    def update_from_map(self, coordinate):
        self.coordinate = coordinate
        self._lat_spinbox.setValue(self.coordinate.latitude())
        self._lng_spinbox.setValue(self.coordinate.longitude())

    def handle_clicked(self):
        self.map_view.exec_()


class WizardPage(QWizardPage):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.geo_widget1 = GeoWidget()
        self.geo_widget2 = GeoWidget()

        self.registerField("coordinate1", self.geo_widget1, b"coordinate")
        self.registerField("coordinate2", self.geo_widget2, b"coordinate")

        lay = QVBoxLayout(self)
        lay.addWidget(self.geo_widget1)
        lay.addWidget(self.geo_widget2)


def main():
    app = QApplication(sys.argv)

    w = QWizard()
    page = WizardPage()
    w.addPage(page)
    w.show()

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
代码语言:javascript
复制
import QtLocation 5.15
import QtQuick 2.15

Item {
    width: 400
    height: 400

    Map {
        id: map

        anchors.fill: parent
        zoomLevel: 14

        MouseArea {
            id: mouse
            anchors.fill: parent
            onClicked: controller.update_from_map(map.toCoordinate(Qt.point(mouse.x, mouse.y)))
        }

        plugin: Plugin {
            name: "osm"
        }

    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68106173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档