如何在PyQt5开发的Qt界面中嵌入Navit并调整其窗口属性
现有代码核心问题
- 多余创建了临时
QWidget中转窗口,逻辑冗余,没有直接将承载Navit的容器ID传给环境变量 - 承载Navit的容器未设置父控件、未加入主窗口布局,导致两个窗口完全独立无从属关系
- 缺少窗口大小联动、进程生命周期处理的相关逻辑
修复后可运行代码
import sys import os from PyQt5.QtCore import * from PyQt5.QtWidgets import * class embedNavit(QWidget): def __init__(self): super().__init__() self.process = QProcess(self) # 主窗口基础设置 self.setGeometry(100, 100, 1024, 768) # 创建承载Navit的容器 self.navit_container = QWidget(self) # 将容器的窗口ID写入环境变量,供Navit读取 os.putenv('NAVIT_XID', str(int(self.navit_container.winId()))) # 主窗口布局设置,让容器自动填充主窗口 layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) # 去掉布局边距,Navit铺满主窗口 layout.addWidget(self.navit_container) # 启动Navit进程 self.process.start('navit') # 绑定进程退出信号,程序退出时自动结束Navit进程 self.destroyed.connect(lambda: self.process.kill()) # 重写resize事件,保证Navit始终和主窗口大小同步 def resizeEvent(self, event): super().resizeEvent(event) self.navit_container.resize(self.size()) if __name__ == "__main__": app = QApplication(sys.argv) main = embedNavit() main.show() sys.exit(app.exec_())
额外需求实现说明
去除Navit窗口边框
正确嵌入后Navit不会再显示独立窗口的边框,如果仍有多余边框,直接修改Navit的配置文件navit.xml,找到graphics相关配置项,将border属性设置为0即可完全去掉多余边框。
固定Navit的位置和大小
如果不需要让Navit铺满整个主窗口,注释掉布局相关代码,手动调用self.navit_container.setGeometry(x, y, width, height)设置坐标和尺寸即可。
内容的提问来源于stack exchange,提问作者WillGIam
相关产品推荐
相关产品推荐

