猿问

使用 PyQt5 获取 Qt Designer 中自定义(升级)小部件中另一个小部件的当前值

我已经使用 Qt Designer 为我的应用程序创建了 ui。UI 包括两个小部件。具有不同值的下拉列表(ComboBox),每个值代表一年(2015、2025、2035)和一个在地图上加载 shapefile 的自定义小部件:这是 UI 的屏幕截图(另外,这里是library.ui文件):

这是我连接到 ui的index.py文件:


import sys


from os import environ

from PyQt5.QtCore import *

from PyQt5.QtGui import *

from PyQt5.QtWidgets import *


from PyQt5.uic import loadUiType



ui,_=loadUiType('library.ui')


def suppress_qt_warnings():

    environ["QT_DEVICE_PIXEL_RATIO"] = "0"

    environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"

    environ["QT_SCREEN_SCALE_FACTORS"] = "1"

    environ["QT_SCALE_FACTOR"] = "1"



class MainApp(QMainWindow, ui):

    def __init__(self):

        QMainWindow.__init__(self)

        self.setupUi(self)


def main():

    suppress_qt_warnings()

    app=QApplication(sys.argv)

    window = MainApp()

    window.show()

    sys.exit(app.exec_())



if __name__ == '__main__':

    main()

这是与我的自定义小部件( leafwidget.py )关联的文件:


import folium

import os.path


from PyQt5 import QtCore, QtWebEngineWidgets

from PyQt5.QtWidgets  import *

import geopandas as gpd



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


class LeafWidget (QWidget):

    def __init__(self, parent=None):

        QWidget.__init__(self, parent)

        self.view = QtWebEngineWidgets.QWebEngineView()


        shp_filename = os.path.join(CURRENT_DIR, "input", '2015_loaded_NoCC.dbf')

        shp_file = gpd.read_file(shp_filename)

        shp_file_json_str = shp_file.to_json()


        m = folium.Map(location=[39.764075, -86.159019], zoom_start=10)

        folium.GeoJson(shp_file_json_str).add_to(m)

正如您在我的自定义小部件类 (LeafWidget) 中看到的,dbf 文件的名称以年份值 (2015、2025、2035) 开头,后跟“_loaded_NocCC.dbf”(例如“2015_loaded_NoCC.shp”等)。


现在,我需要从下拉列表中访问所选值(假设为2025),然后在地图中显示相应的 shapefile(2025 _loaded_NoCC.shp)。


我可以使用index.py中的self.ComboBox.currentText()轻松访问 ComboBox 的值,但在 leafletwidget 类(leafwidget.py)中,我无法访问self.ComboBox.currentText()并收到错误基本上我的类没有属性“ComboBox”。


那么,如何访问 LeafWidget 类中 ComboBox 的值?


潇潇雨雨
浏览 123回答 1
1回答

回首忆惘然

您必须创建一个方法来更新将显示的 shapefile,并在每次选择新选项生成新路径时调用该方法:import foliumfrom PyQt5 import QtCore, QtWebEngineWidgetsfrom PyQt5.QtWidgets import *import geopandas as gpdclass LeafWidget(QWidget):    def __init__(self, parent=None):        QWidget.__init__(self, parent)        self.view = QtWebEngineWidgets.QWebEngineView()        lay = QVBoxLayout(self)        lay.addWidget(self.view)        self.tmp_file = QtCore.QTemporaryFile("XXXXXX.html")    def set_shapefile(self, filename):        shp_file = gpd.read_file(filename)        shp_file_json_str = shp_file.to_json()        m = folium.Map(location=[39.764075, -86.159019], zoom_start=10)        folium.GeoJson(shp_file_json_str).add_to(m)        if self.tmp_file.open():            m.save(self.tmp_file.fileName())            url = QtCore.QUrl.fromLocalFile(self.tmp_file.fileName())            self.view.load(url)import sysimport os.pathfrom os import environfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *from PyQt5.uic import loadUiTypeCURRENT_DIR = os.path.dirname(os.path.realpath(__file__))ui, _ = loadUiType(os.path.join(CURRENT_DIR, "library.ui"))def suppress_qt_warnings():    environ["QT_DEVICE_PIXEL_RATIO"] = "0"    environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"    environ["QT_SCREEN_SCALE_FACTORS"] = "1"    environ["QT_SCALE_FACTOR"] = "1"class MainApp(QMainWindow, ui):    def __init__(self):        QMainWindow.__init__(self)        self.setupUi(self)        self.comboBox.currentTextChanged.connect(self.handle_currentTextChanged)        self.handle_currentTextChanged(self.comboBox.currentText())    def handle_currentTextChanged(self, text):        filename = shp_filename = os.path.join(            CURRENT_DIR, "input", "{}_loaded_NoCC.shp".format(text)        )        self.LeafWidget.set_shapefile(filename)def main():    suppress_qt_warnings()    app = QApplication(sys.argv)    window = MainApp()    window.show()    sys.exit(app.exec_())if __name__ == "__main__":    main()
随时随地看视频慕课网APP

相关分类

Python
我要回答