1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        簡(jiǎn)單改寫一個(gè)Linux下最好用的截圖工具

        共 4815字,需瀏覽 10分鐘

         ·

        2020-08-05 01:22

        因?yàn)槿粘inux辦公,經(jīng)常有截圖順帶簡(jiǎn)單編輯的需求。

        在Windows上這項(xiàng)工作基本一直是QQ微信代勞,但是在Linux上這兩個(gè)都比較拉胯,無(wú)奈之下找了幾種Linux下的截圖工具替代

        試了幾個(gè)比較流行的,感覺(jué)下來(lái)最好用的算是flameshot,功能齊全運(yùn)行穩(wěn)定,圖標(biāo)也挺新潮,操作界面也很簡(jiǎn)潔,基本毛病沒(méi)得挑。但唯一的缺點(diǎn)就是:「沒(méi)有全局熱鍵?!?/strong>

        好在flameshot是個(gè)開源軟件,下下來(lái)源碼瞅了一眼,是我熟悉的Qt寫的,感覺(jué)全局熱鍵這部分可以自己整合一下。

        源碼中對(duì)全局熱鍵的實(shí)現(xiàn)只放開了windows,而且從源碼來(lái)看好像也只預(yù)留了接口沒(méi)實(shí)現(xiàn)功能。簡(jiǎn)單研究了一下,通過(guò)一個(gè)名為qxtglobalshortcut5的Qt全局熱鍵第三方庫(kù)可以輕松實(shí)現(xiàn)

        使用

        先把現(xiàn)成的工具放出來(lái)吧,伸手黨福利:https://kdocs.cn/l/sgGCbHx3wSaM [金山文檔] flameshot

        • 復(fù)制鏈接到瀏覽器直接下載,啟動(dòng)后任務(wù)欄會(huì)有圖標(biāo),點(diǎn)擊Take Screenshot即可截圖
        • 點(diǎn)擊一次截圖后,全局熱鍵才可以使用?!癈trl + F5” 即可觸發(fā)截圖(ubuntu源內(nèi)自帶的qt5.5編譯會(huì)有這個(gè)問(wèn)題,qt5.7編譯出的程序直接啟動(dòng)后全局熱鍵就可以用)。
        • 自己編譯的話是有翻譯的,這里單程序沒(méi)有翻譯文件,所以都是英文,不過(guò)不影響使用。
        • 效果如圖:具體的使用快捷鍵和功能去其他地方查一下吧,我就不搬運(yùn)了,都是很基本的截圖編輯操作,好用得很:
        • 建議在設(shè)置里開機(jī)自啟,或者加nohup ...... &啟動(dòng),不占用終端。
        • 這個(gè)程序我是用的ubuntu16.04源內(nèi)自帶的庫(kù)編譯的,所以僅僅適用于ubuntu 16.04。換到其他Linux系統(tǒng)不一定能用。其他Linux平臺(tái)會(huì)因?yàn)椴蛔詭t或者自帶qt庫(kù)版本不一樣導(dǎo)致不能用的問(wèn)題,最好的辦法是自行下載編譯,方法如下:

        編譯(Ubuntu 16.04環(huán)境)

        環(huán)境準(zhǔn)備

        Ubuntu16.04自帶了一些Qt5.5.1的核心庫(kù),但是要編譯的話還需要qmake,lrelease等工具,還有x11extras svg等qt插件支持,需要安裝:

        sudo?apt-get?install?qt5-default
        sudo?apt-get?install?qttools5-dev-tools
        sudo?apt-get?install?libqt5svg5-dev
        sudo?apt-get?install?libqt5x11extras5-dev
        sudo?apt-get?install?qtbase5-private-dev

        都直接從源里下,這樣能保證都是配套同一個(gè)版本的。

        獲取flameshot源碼:

        地址:https://github.com/lupoDharkael/flameshot.git

        git?clone?https://github.com/lupoDharkael/flameshot.git

        編譯源碼

        cd?flameshot
        mkdir?build?
        cd?build?
        qmake?../?
        #?報(bào)錯(cuò)沒(méi)有qmake的話,要裝上面的庫(kù)
        make?-j`nproc`
        sudo?ln?-sf?`pwd`/flameshot?/usr/bin/flameshot

        編譯完成后,會(huì)生成一個(gè)可執(zhí)行文件flameshot,可以直接放一個(gè)軟連接到/usr/bin下面

        增加全局熱鍵功能

        一、獲取qxtglobalshortcut5項(xiàng)目到此項(xiàng)目中

        #?離開剛才的編譯目錄
        cd?../?
        #?pwd:?~/flameshot
        git?clone?https://github.com/ddqd/qxtglobalshortcut5.git

        flameshot項(xiàng)目和qxtglobalshortcut5這個(gè)項(xiàng)目都是qt的pro管理的,整合起來(lái)非常方便 在獲取到qxtglobalshortcut5項(xiàng)目后,flameshot項(xiàng)目下就有這個(gè)玩意兒:qxtglobalshortcut5的實(shí)現(xiàn)已經(jīng)相當(dāng)完善了,引入后一行都不需要改,只需要改寫flameshot項(xiàng)目 在flameshot.pro文件中添加一行:include(qxtglobalshortcut5/qxt.pri)

        QT??+=?core?gui?widgets?network?svg

        unix:!macx?{
        ????QT??+=?dbus
        }

        CONFIG?+=?c++11?link_pkgconfig
        include(qxtglobalshortcut5/qxt.pri)???#?這一行是新加的
        #CONFIG?+=?packaging???#?Enables?"make?install"?for?packaging?paths

        TARGET?=?flameshot
        TEMPLATE?=?app

        二、源碼里注冊(cè)全局熱鍵

        打開src/core/controller.cpp這個(gè)文件,找到Controller的構(gòu)造函數(shù),在這里注冊(cè)全局熱鍵:

        Controller::Controller()?:?m_captureWindow(nullptr)?{
        ????qApp->setQuitOnLastWindowClosed(false);

        ????//?init?tray?icon
        #if?defined(Q_OS_LINUX)?||?defined(Q_OS_UNIX)
        ????if?(!ConfigHandler().disabledTrayIconValue())?{
        ????????enableTrayIcon();
        ????????}
        ????????/**?注冊(cè)全局熱鍵!?*/
        ????????QxtGlobalShortcut*?shortcut1?=?new?QxtGlobalShortcut(QKeySequence("Ctrl+F5"),?this);?
        ????????/**?全局熱鍵觸發(fā)的函數(shù)!?*/
        ????????connect(shortcut1,?SIGNAL(activated()),?this,?SLOT(shortcutActiveCapture()));?
        #elif?defined(Q_OS_WIN)
        ????enableTrayIcon();

        ????GlobalShortcutFilter?*nativeFilter?=?new?GlobalShortcutFilter(this);
        ????qApp->installNativeEventFilter(nativeFilter);
        ????connect(nativeFilter,?&GlobalShortcutFilter::printPressed,
        ????????????this,?[this](){
        ????????this->requestCapture(CaptureRequest(CaptureRequest::GRAPHICAL_MODE));
        ????});?
        #endif

        ????QString?StyleSheet?=?CaptureButton::globalStyleSheet();
        ????qApp->setStyleSheet(StyleSheet);
        }

        這里除了注釋的兩行是我加的,其他都是原來(lái)的代碼,這個(gè)庫(kù)支持字符串的形式注冊(cè)全局熱鍵,Ctrl+F5可以換成你自己喜歡的。

        因?yàn)闆](méi)有在Window上測(cè)試過(guò)們這里只加給了Q_OS_LINUX環(huán)境,理論上這個(gè)全局熱鍵的庫(kù)各平臺(tái)都是通用的,不過(guò)我只需要Linux。

        三、全局熱鍵的處理函數(shù)

        上面給shortchut1注冊(cè)了一個(gè)槽函數(shù)shortcutActiveCapture,這個(gè)函數(shù)還沒(méi)有實(shí)現(xiàn),這個(gè)函數(shù)的功能很簡(jiǎn)單,只需要調(diào)用截圖函數(shù)就行,可以查一下我們點(diǎn)擊截圖觸發(fā)的是哪一個(gè)函數(shù),我們也調(diào)用同一個(gè)函數(shù)即可:

        • src/core/controller.h 文件,在頭文件里,添加函數(shù)聲明:
        private?slots:
        ????void?startFullscreenCapture(const?uint?id?=?0);
        ????void?startVisualCapture(const?uint?id?=?0,
        ?????????????????????????????const?QString?&forcedSavePath?=?QString())
        ;
        ????void?startScreenGrab(const?uint?id?=?0,?const?int?screenNumber?=?-1);

        ????void?handleCaptureTaken(uint?id,?QPixmap?p);
        ????void?handleCaptureFailed(uint?id);
        ????void?shortcutActiveCapture();?//這一句是追加的
        • src/core/controller.cpp文件,在實(shí)現(xiàn)文件里,添加函數(shù)實(shí)現(xiàn):
        void?Controller::shortcutActiveCapture()
        {
        ????this->startVisualCapture(0,QString());
        }

        「四、重新編譯運(yùn)行」

        進(jìn)入到剛才的編譯目錄,重新執(zhí)行qmake,make編譯就可以了。

        cd?build?
        qmake?../
        make?

        編譯好后可以試一下,生成的可執(zhí)行程序運(yùn)行后可以通過(guò)全局熱鍵Ctrl+F5進(jìn)行截屏編輯操作。

        這個(gè)改動(dòng)非常簡(jiǎn)單,通篇使用的是Ubuntu源內(nèi)自帶的工具和庫(kù)。即使沒(méi)怎么接觸過(guò)qt的人,按照上面的套路也可以把這個(gè)工具輕松整出來(lái)。

        如果是Qt老炮,可以通過(guò)本地編譯出來(lái)或者本地安裝的其他版本的qt編譯這個(gè)程序,目前嘗試qt5.5.1全局熱鍵還是有點(diǎn)問(wèn)題的,上面也提到了。我本地用的qt5.7沒(méi)有這個(gè)問(wèn)題。

        存在問(wèn)題:失去焦點(diǎn)就消失的窗體

        理論上可以點(diǎn)擊截圖的地方,完全用不到全局熱鍵,只有一種場(chǎng)景對(duì)全局熱鍵截圖這個(gè)功能有剛需:失去焦點(diǎn)窗體就消失的情況。比如,你在chorme瀏覽器的某個(gè)標(biāo)簽頁(yè)上右鍵彈出一個(gè)對(duì)話框,你想截圖這個(gè)對(duì)話框里的內(nèi)容,但是一旦你鼠標(biāo)去點(diǎn)擊截圖的按鈕,這個(gè)對(duì)話框就會(huì)因?yàn)槭ソ裹c(diǎn)而消失。這個(gè)時(shí)候就需要截圖全局熱鍵的功能來(lái)實(shí)現(xiàn):或者對(duì)一些鼠標(biāo)懸停才會(huì)顯示的內(nèi)容tooltips的截圖也是這樣:

        但遺憾的是,在Linux平臺(tái)上,這個(gè)全局快捷鍵截圖仍然不能非常完美的解決所有“失焦即焚”窗體的問(wèn)題

        比如說(shuō)你隨便打開一個(gè)窗口,鼠標(biāo)挪到左上角隨便點(diǎn)一個(gè)選項(xiàng)卡(文件、修改、視圖等等的),當(dāng)他出現(xiàn)菜單時(shí),你想截圖這個(gè)菜單的內(nèi)容,你就會(huì)發(fā)現(xiàn)全局熱鍵不好使了:當(dāng)這個(gè)紅框窗體拿到焦點(diǎn)的時(shí)候,全局熱鍵就不好使了,為了讓全局熱鍵生效讓他失去焦點(diǎn),這個(gè)窗體又會(huì)消失。進(jìn)入到一種無(wú)法截圖的尷尬境地。(我這張是對(duì)著虛擬機(jī)截出來(lái)的)

        但這個(gè)問(wèn)題并不是qxtglobalshortcut5實(shí)現(xiàn)的問(wèn)題,而是X11本身的限制,一個(gè)直觀的證據(jù)就是:在這種情況下,你鍵盤上的PrintScreen按鍵也會(huì)失效。

        為了這個(gè)問(wèn)題大概看了下qxtglobalshortcut5的Linux部分的實(shí)現(xiàn),確實(shí)已經(jīng)是x11提供的XGrabKey所能提供功能的極限了,如果硬要讓自己全局熱鍵的優(yōu)先級(jí)高于窗口管理器,可能得寫驅(qū)動(dòng)級(jí)別的程序來(lái)搞。

        存在問(wèn)題2:輸入文字不支持輸入法

        文字只能輸入英文,這個(gè)也比較坑,目前還在想辦法,目測(cè)可以用加載ibus/fcitx輸入法插件的方式解決,后期解決后回來(lái)更新,有了解的大佬歡迎不吝賜教。


        瀏覽 65
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

          <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一级黄色电影视频 | 欧美老妇性猛交 | 五月天一区二区 | 国产精品午夜福利视频 | 激情一区| 啊灬啊灬啊灬啊灬高潮在线看 | 欧美一级久久久 | 韩国三级《女教师》 | 天堂俺去俺来也WWW色光网 | 欧美黄频 |