macOS上实现Qt应用程序做文件关联打开
一、背景介紹
? ? 用Qt開發(fā)的應(yīng)用程序要實(shí)現(xiàn)文件關(guān)聯(lián),雙擊時(shí)用默認(rèn)關(guān)聯(lián)的程序打開文件,在Windows上這個(gè)功能非常容易實(shí)現(xiàn)。Windows應(yīng)用程序在安裝的時(shí)候可以在注冊(cè)表中寫入相關(guān)的鍵值對(duì)。打開文件的時(shí)候,Windows Explorer會(huì)將文件完整的路徑作為參數(shù)傳遞給關(guān)聯(lián)的應(yīng)用程序。這樣就可以在啟動(dòng)程序后將這個(gè)文件作為目標(biāo)進(jìn)行處理。
? ? ?如上述代碼所示,接著我們就可以在main函數(shù)的argv中獲取到文件路徑,完成文件的關(guān)聯(lián)打開。但是在macOS上卻不是這么做的。首先macOS上沒有類似Windows注冊(cè)表,不會(huì)寫入這些信息;其次,macOS上常見的安裝包格式pkg也不提供這些功能。那么,在macOS上我們應(yīng)該怎么來實(shí)現(xiàn)這樣的功能呢?我們馬上來看看。
? ? 首先,要實(shí)現(xiàn)雙擊用關(guān)聯(lián)程序打開文件這個(gè)功能,要分兩個(gè)步驟:(1)通過某種方式來聲明我們的應(yīng)用程序支持哪些文檔類型;(2)要接收從窗口管理系統(tǒng)傳遞過來的文件路徑。滿足了這兩點(diǎn),才能正常實(shí)現(xiàn)目標(biāo)功能。
(1)文件格式關(guān)聯(lián)聲明
? ? 在macOS上,每個(gè)應(yīng)用程序里面都會(huì)包含一個(gè)info.plist文件。這個(gè)文件以XML格式來組織一些鍵值對(duì)。每個(gè)鍵值對(duì)都包含聲明了一個(gè)特定的信息,如版本號(hào)、文檔類型、簽名信息和標(biāo)識(shí)符等。應(yīng)用程序支持哪些文檔格式也是在這個(gè)文件里面進(jìn)行聲明的。
? ? 可以看到,這個(gè)info.plist文件里面我們添加了三種文檔格式。每當(dāng)嘗試使用應(yīng)用程序來打開一個(gè)文檔時(shí),都會(huì)根據(jù)這些信息來確定是否支持打開。
(2)接收目標(biāo)文檔路徑
? ? 在macOS上打開一個(gè)文檔時(shí),macOS Finder不會(huì)像Windows Explorer一樣將文件名作為關(guān)聯(lián)程序的啟動(dòng)參數(shù)。我們測(cè)試的時(shí)候也可以發(fā)現(xiàn),程序啟動(dòng)的時(shí)候main函數(shù)的argc參數(shù)值永遠(yuǎn)是1,除了程序名之外不會(huì)有其他參數(shù)存在。事實(shí)上,在macOS上我們用Qt開發(fā)的程序可以監(jiān)聽QFileOpenEvent這樣一個(gè)事件,來實(shí)現(xiàn)對(duì)文件路徑的捕獲。
? ? 在Qt文檔中我們可以看到這樣一個(gè)示例:
1 #include <QApplication> 2 #include <QFileOpenEvent> 3 #include <QtDebug> 4 5 class MyApplication : public QApplication 6 { 7 public: 8 MyApplication(int &argc, char **argv) 9 : QApplication(argc, argv) 10 { 11 } 12 13 bool event(QEvent *event) 14 { 15 if (event->type() == QEvent::FileOpen) { 16 QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(event); 17 qDebug() << "Open file" << openEvent->file(); 18 } 19 20 return QApplication::event(event); 21 } 22 };? ? 示例中繼承了QApplication類,并在event函數(shù)中處理了QFileOpenEvent事件。這個(gè)事件可以直接獲取到正在打開的文件名和文件路徑,也就實(shí)現(xiàn)了我們的目的了。這里我們?cè)赒Application里面處理了這個(gè)事件,根據(jù)需要我們也可以將這個(gè)文件路徑傳到主窗口類中進(jìn)行后續(xù)的打開操作。至此,結(jié)合上面的這方面的設(shè)置,我們這個(gè)功能就完成了。
?二、參考鏈接
1. https://forum.qt.io/topic/80205/open-file-with-double-click-on-mac/8
2. https://stackoverflow.com/questions/26849866/unable-to-open-file-with-qt-app-on-mac
3. https://doc.qt.io/qt-5/qfileopenevent.html?
轉(zhuǎn)載于:https://www.cnblogs.com/csuftzzk/p/qt_macos_file_association_open.html
總結(jié)
以上是生活随笔為你收集整理的macOS上实现Qt应用程序做文件关联打开的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在VMware运行Linux下,密码错误
- 下一篇: 借助axios的拦截器实现Vue.js中