You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在macOS的PyQt5 GUI中嵌入外部应用?

Hey there! Let's tackle how to embed that third-party app (like the Mac Calculator) into your PyQt5 window. Below is a practical, step-by-step solution tailored for macOS:

Embed Third-Party App into PyQt5 Window on macOS

Problem Overview

I'm developing an app that uses third-party software for visualization, with PyQt5 handling command sending and other GUI operations. Right now, the PyQt5 window and visualization window are separate, and I want to merge them into a single window. I'm trying to create a simple example that launches the Mac Calculator app alongside a basic PyQt5 window with a text label.

Solution: Use QMacNativeWidget for Native App Embedding

On macOS, Qt provides QMacNativeWidget—a tool built specifically to wrap native macOS windows into PyQt5 widgets. Here's a complete working example that embeds the Calculator app into your PyQt5 main window:

import os
import sys
import subprocess
import time
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel)
from PyQt5.QtMacExtras import QMacNativeWidget
import Cocoa

class EmbeddedAppWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 + Embedded Calculator")
        self.setGeometry(100, 100, 800, 600)
        
        # Set up main layout and PyQt5 UI elements
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)
        
        # Add your custom PyQt5 content first
        ui_label = QLabel("This is my PyQt5 UI with the embedded Calculator below:")
        main_layout.addWidget(ui_label)
        
        # Launch the Calculator app
        subprocess.Popen(["open", "-n", "/System/Applications/Calculator.app"])
        
        # Give the app a moment to launch (adjust timing if needed)
        time.sleep(0.5)
        
        # Locate the Calculator app's window via Cocoa
        workspace = Cocoa.NSWorkspace.sharedWorkspace()
        running_apps = workspace.runningApplications()
        calculator_app = None
        
        for app in running_apps:
            if app.bundleIdentifier() == "com.apple.Calculator":
                calculator_app = app
                break
        
        if calculator_app and calculator_app.windows():
            # Grab the first window of the Calculator app
            calc_window = calculator_app.windows()[0]
            
            # Create a native widget wrapper and embed the window
            native_container = QMacNativeWidget()
            native_container.setNativeWindow(calc_window)
            
            # Add the embedded app to our PyQt5 layout
            main_layout.addWidget(native_container)
            
            # Optional: Hide the original app's title bar for a seamless look
            calc_window.setTitlebarVisible_(False)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = EmbeddedAppWindow()
    main_window.show()
    sys.exit(app.exec_())

Key Details & Tips

  • Dependencies: You'll need to install PyObjC to access the Cocoa framework—run pip install pyobjc first.
  • Bundle Identifiers: To find the correct bundle ID for your target app, run osascript -e 'id of app "App Name"' in Terminal (replace "App Name" with your visualization app).
  • Launch Timing: The time.sleep(0.5) ensures the third-party app has time to initialize before we try to embed it. Adjust this delay if the app takes longer to launch.
  • Sandboxing Restrictions: Some apps (especially sandboxed ones) might block window embedding. If your visualization app has this issue, you may need to explore alternatives like X11 forwarding (if supported) or a lightweight screen capture overlay.

内容的提问来源于stack exchange,提问作者Ned U

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:11:49