網站首頁 編程語言 正文
一、前言
設計應用程序時,有時不希望將一個不太相關的功能集成到程序中,或者是因為該功能與當前設計的應用程序聯系不大,或者是因為該功能已經可以使用現成的程序很好地實現了,這時就可以在當前的應用程序中調用外部的程序來實現該功能,這就會使用到進程。Qt應用程序可以很容易地啟動一個外部應用程序,而且Qt也提供了很多種進程間通信的方法。
二、運行一個進程
Qt的QProcess類用來啟動一個外部程序并與其通信。要啟動一個程序,可以使用start()函數,然后將程序名稱和運行這個程序說要使用的命令行參數作為該函數的參數。執行完start()后,QProcess進入Starting狀態,當程序已經運行后,QProcess就會進入Running狀態并發射started信號。當進程退出后,QProcess重新進入NotRunning狀態(初始狀態)并發射finished信號。
發射的finished信號提供了進程的退出代碼和退出狀態,也可以調用exitCode()來獲取上一個結束的進程的退出代碼,使用exitStatus()來獲取它的退出狀態。任何時間發生了錯誤,QProcess都會發射error信號,也可以調用error()來查看錯誤的類型和上次發生的錯誤。使用state()可以查看當前進程的狀態。
三、啟動進程的例子
本例中通過按下按鈕,啟動了windows系統自帶的記事本程序,即notepad.exe, 因為它在windows的系統目錄下,該目錄已經加在了系統的PATH環境變量中,所以不需要特別指定路徑。
運行程序,然后單擊按鈕,就可以啟動記事本程序,可以看到,使用QProcess運行一個外部程序是很簡單的。
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QMessageBox
from PyQt5.QtCore import QProcess
import sys
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.__process = QProcess()
self.__btn = QPushButton('start notepad')
self.__init_ui()
# 關聯button clicked信號和對應的槽函數
self.__btn.clicked.connect(self.__btn_clicked_handler)
self.__process.started.connect(self.__process_started_handler)
self.__process.finished.connect(self.__process_finished_handler)
def __init_ui(self):
my_layout = QHBoxLayout()
my_layout.addWidget(self.__btn)
self.setLayout(my_layout)
def __btn_clicked_handler(self):
'''
處理button的clicked信號,打開notepad.exe
'''
self.__process.start('notepad.exe')
def __process_started_handler(self):
'''
處理QProcess的started信號
'''
start_msg_box = QMessageBox.information(self,
'info',
'已成功打開記事本',
QMessageBox.StandardButton.Yes,
QMessageBox.StandardButton.Yes)
def __process_finished_handler(self, exitCode, exitStatus):
'''
處理QProcess的finished信號,獲取退出狀態
'''
finished_msg_box = QMessageBox.information(self,
'info',
f'記事本已關閉, exitcode={exitCode}, exitStatus:{exitStatus}',
QMessageBox.StandardButton.Yes,
QMessageBox.StandardButton.Yes)
if __name__ == '__main__':
app = QApplication(sys.argv)
my_widget = MyWidget()
my_widget.show()
sys.exit(app.exec_())
運行效果如下,
原文鏈接:https://blog.csdn.net/hubing_hust/article/details/128364034
相關推薦
- 2022-11-21 詳解Go語言中的內存對齊_Golang
- 2022-06-04 解決Go語言time包數字與時間相乘的問題_Golang
- 2022-07-29 C++超詳細講解智能指針_C 語言
- 2022-08-13 Linux內核中container_of宏定義講解
- 2022-11-16 Python?讀取?.gz?文件全過程_python
- 2022-10-01 使用python+Flask實現日志在web網頁實時更新顯示_python
- 2022-05-28 C語言?超詳細講解庫函數_C 語言
- 2022-05-31 ASP.NET?Core使用NLog記錄日志_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支