日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt学习之路(58): 进程间交互

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt学习之路(58): 进程间交互 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

所謂 IO 其實不過是與其他設備之間的數據交互。在 Linux 上這個概念或許會更加清楚一些。Linux 把所有設備都看作是一種文件,因此所有的 IO 都歸結到對文件的數據交互。同樣,與其他進程之間也存在著數據交互,這就是進程間交互。

為什么需要進程間交互呢?Qt 雖然是一個很龐大的庫,但是也不能面面俱到。每個需求都提供一種解決方案是不現實的。比如操作系統提供了查看當前文件夾下所有文件的命令(Windows 下是 dir, Linux 下是 ls),那么 Qt 就可以通過調用這個命令獲取其中的信息。當然這不是一個很恰當的例子,因為 Qt 同樣提供了相同的操作。不過,如果你使用版本控制系統,比如 SVN,然后你希望通過 SVN 的版本號生成自己系統的 build number,那么就不得不調用 svn 命令獲取當前倉庫的版本號。這些操作都涉及到進程間交互。

Qt 使用 QProcess 類完成進程間交互。我們從例子開始看起。由于比較簡單,所以沒有把 main() 函數貼上來,大家順手寫下就好的啦!

mainwindow.h

  • #ifndef?MAINWINDOW_H ?
  • #define?MAINWINDOW_H ?
  • ?
  • #include?<QtGui> ?
  • ?
  • class?MainWindow?:?public?QMainWindow ?
  • { ?
  • ????Q_OBJECT ?
  • ?
  • public: ?
  • ????MainWindow(QWidget?*parent?=?0); ?
  • ????~MainWindow(); ?
  • ?
  • private?slots: ?
  • ????void?openProcess(); ?
  • ?
  • private: ?
  • ????QProcess?*p; ?
  • }; ?
  • ?
  • #endif?//?MAINWINDOW_H?
  • mainwindow.cpp

  • #include?"mainwindow.h" ?
  • ?
  • MainWindow::MainWindow(QWidget?*parent) ?
  • ????:?QMainWindow(parent) ?
  • { ?
  • ????p?=?new?QProcess(this); ?
  • ????QPushButton?*bt?=?new?QPushButton("execute?notepad",?this); ?
  • ????connect(bt,?SIGNAL(clicked()),?this,?SLOT(openProcess())); ?
  • } ?
  • ?
  • MainWindow::~MainWindow() ?
  • { ?
  • ?
  • } ?
  • ?
  • void?MainWindow::openProcess() ?
  • { ?
  • ????p->start("notepad.exe"); ?
  • }?
  • 這個窗口很簡單,只有一個按鈕,當你點擊按鈕之后,程序會調用 Windows 的記事本。這里我們使用的是

  • p->start("notepad.exe");?
  • 語句。QProcess::start() 接受兩個參數,第一個是要執行的命令或者程序,這里就是 notepad.exe;第二個是一個 QStringList 類型的數據,也就是需要傳遞給這個程序的運行參數。注意,這個程序是需要能夠由系統找到的,一般是完全路徑。但是這里為什么只有 notepad.exe 呢?因為這個程序實際是放置在 Windows 系統文件夾下,是已經添加到了系統路徑之中,因此不需要再添加本身的路徑。

    下面我們再看一個更復雜的例子,調用一個系統命令,這里我使用的是 Windows,因此需要調用 dir;如果你是在 Linux 進行編譯,就需要改成 ls 了。

    mainwindow.h

  • #ifndef?MAINWINDOW_H ?
  • #define?MAINWINDOW_H ?
  • ?
  • #include?<QtGui> ?
  • ?
  • class?MainWindow?:?public?QMainWindow ?
  • { ?
  • ????Q_OBJECT ?
  • ?
  • public: ?
  • ????MainWindow(QWidget?*parent?=?0); ?
  • ????~MainWindow(); ?
  • ?
  • private?slots: ?
  • ????void?openProcess(); ?
  • ????void?readResult(int?exitCode); ?
  • ?
  • private: ?
  • ????QProcess?*p; ?
  • }; ?
  • ?
  • #endif?//?MAINWINDOW_H?
  • mainwindow.cpp

  • #include?"mainwindow.h" ?
  • ?
  • MainWindow::MainWindow(QWidget?*parent) ?
  • ????:?QMainWindow(parent) ?
  • { ?
  • ????p?=?new?QProcess(this); ?
  • ????QPushButton?*bt?=?new?QPushButton("execute?notepad",?this); ?
  • ????connect(bt,?SIGNAL(clicked()),?this,?SLOT(openProcess())); ?
  • } ?
  • ?
  • MainWindow::~MainWindow() ?
  • { ?
  • ?
  • } ?
  • ?
  • void?MainWindow::openProcess() ?
  • { ?
  • ????p->start("cmd.exe",?QStringList()?<<?"/c"?<<?"dir"); ?
  • ????connect(p,?SIGNAL(finished(int)),?this,?SLOT(readResult(int))); ?
  • } ?
  • ?
  • void?MainWindow::readResult(int?exitCode) ?
  • { ?
  • ????if(exitCode?==?0)?{ ?
  • ????????QTextCodec*?gbkCodec?=?QTextCodec::codecForName("GBK"); ?
  • ????????QString?result?=?gbkCodec->toUnicode(p->readAll()); ?
  • ????????QMessageBox::information(this,?"dir",?result); ?
  • ????} ?
  • } ?
  • 我們僅增加了一個 slot 函數。在按鈕點擊的 slot 中,我們通過 QProcess::start() 函數運行了指令

    cmd.exe /c dir

    這里是說,打開系統的 cmd 程序,然后運行 dir 指令。如果有對參數 /c 有疑問,只好去查閱 Windows 的相關手冊了哦,這已經不是 Qt 的問題了。然后我們 process 的 finished() 信號連接到新增加的 slot 上面。這個 signal 有一個參數 int。我們知道,對于 C/C++ 程序而言,main() 函數總是返回一個 int,也就是退出代碼,用于指示程序是否正常退出。這里的 int 參數就是這個退出代碼。在 slot 中,我們檢查退出代碼是否是0,一般而言,如果退出代碼為0,說明是正常退出。然后把結果顯示在 QMessageBox 中。怎么做到的呢?原來,QProcess::readAll() 函數可以讀出程序輸出內容。我們使用這個函數將所有的輸出獲取之后,由于它的返回結果是 QByteArray 類型,所以再轉換成 QString 顯示出來。另外注意一點,中文本 Windows 使用的是 GBK 編碼,而 Qt 使用的是 Unicode 編碼,因此需要做一下轉換,否則是會出現亂碼的,大家可以嘗試一下。

    好了,進程間交互就說這么說,通過查看文檔你可以找到如何用 QProcess 實現進程過程的監聽,或者是令Qt 程序等待這個進程結束后再繼續執行的函數。

    轉載于:https://blog.51cto.com/devbean/305116

    總結

    以上是生活随笔為你收集整理的Qt学习之路(58): 进程间交互的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。