公众号关注 “五分钟学算法”

设为 “星标”,带你挖掘更多开发神器!

因为日常Linux办公,经常有截图顺带简单编辑的需求。

在Windows上这项工作基本一直是QQ微信代劳,但是在Linux上这两个都比较拉胯,无奈之下找了几种Linux下的截图工具替代

试了几个比较流行的,感觉下来最好用的算是flameshot,功能齐全运行稳定,图标也挺新潮,操作界面也很简洁,基本毛病没得挑。但唯一的缺点就是:「没有全局热键。」

好在flameshot是个开源软件,下下来源码瞅了一眼,是我熟悉的Qt写的,感觉全局热键这部分可以自己整合一下。

源码中对全局热键的实现只放开了windows,而且从源码来看好像也只预留了接口没实现功能。简单研究了一下,通过一个名为qxtglobalshortcut5的Qt全局热键第三方库可以轻松实现

使用

先把现成的工具放出来吧,伸手党福利:https://kdocs.cn/l/sgGCbHx3wSaM [金山文档] flameshot

  • 复制链接到浏览器直接下载,启动后任务栏会有图标,点击Take Screenshot即可截图

  • 点击一次截图后,全局热键才可以使用。“Ctrl + F5” 即可触发截图(ubuntu源内自带的qt5.5编译会有这个问题,qt5.7编译出的程序直接启动后全局热键就可以用)。

  • 自己编译的话是有翻译的,这里单程序没有翻译文件,所以都是英文,不过不影响使用。

  • 效果如图:具体的使用快捷键和功能去其他地方查一下吧,我就不搬运了,都是很基本的截图编辑操作,好用得很:

  • 建议在设置里开机自启,或者加nohup ...... &启动,不占用终端。

  • 这个程序我是用的ubuntu16.04源内自带的库编译的,所以仅仅适用于ubuntu 16.04。换到其他Linux系统不一定能用。其他Linux平台会因为不自带qt或者自带qt库版本不一样导致不能用的问题,最好的办法是自行下载编译,方法如下:

编译(Ubuntu 16.04环境)

环境准备

Ubuntu16.04自带了一些Qt5.5.1的核心库,但是要编译的话还需要qmakelrelease等工具,还有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

都直接从源里下,这样能保证都是配套同一个版本的。

获取flameshot源码:

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

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

编译源码

cd flameshot
mkdir build
cd build
qmake ../
# 报错没有qmake的话,要装上面的库
make -j`nproc`
sudo ln -sf `pwd`/flameshot /usr/bin/flameshot

编译完成后,会生成一个可执行文件flameshot,可以直接放一个软连接到/usr/bin下面

增加全局热键功能

一、获取qxtglobalshortcut5项目到此项目中

# 离开刚才的编译目录
cd ../
# pwd: ~/flameshot
git clone https://github.com/ddqd/qxtglobalshortcut5.git

flameshot项目和qxtglobalshortcut5这个项目都是qt的pro管理的,整合起来非常方便 在获取到qxtglobalshortcut5项目后,flameshot项目下就有这个玩意儿:qxtglobalshortcut5的实现已经相当完善了,引入后一行都不需要改,只需要改写flameshot项目 在flameshot.pro文件中添加一行:include(qxtglobalshortcut5/qxt.pri)

QT  += core gui widgets network svgunix:!macx {QT  += dbus
}CONFIG += c++11 link_pkgconfig
include(qxtglobalshortcut5/qxt.pri)   # 这一行是新加的
#CONFIG += packaging   # Enables "make install" for packaging pathsTARGET = flameshot
TEMPLATE = app

二、源码里注册全局热键

打开src/core/controller.cpp这个文件,找到Controller的构造函数,在这里注册全局热键:

Controller::Controller() : m_captureWindow(nullptr) {qApp->setQuitOnLastWindowClosed(false);// init tray icon
#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX)if (!ConfigHandler().disabledTrayIconValue()) {enableTrayIcon();}/** 注册全局热键! */QxtGlobalShortcut* shortcut1 = new QxtGlobalShortcut(QKeySequence("Ctrl+F5"), this); /** 全局热键触发的函数! */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));});
#endifQString StyleSheet = CaptureButton::globalStyleSheet();qApp->setStyleSheet(StyleSheet);
}

这里除了注释的两行是我加的,其他都是原来的代码,这个库支持字符串的形式注册全局热键,Ctrl+F5可以换成你自己喜欢的。

因为没有在Window上测试过们这里只加给了Q_OS_LINUX环境,理论上这个全局热键的库各平台都是通用的,不过我只需要Linux。

三、全局热键的处理函数

上面给shortchut1注册了一个槽函数shortcutActiveCapture,这个函数还没有实现,这个函数的功能很简单,只需要调用截图函数就行,可以查一下我们点击截图触发的是哪一个函数,我们也调用同一个函数即可:

  • src/core/controller.h 文件,在头文件里,添加函数声明:

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文件,在实现文件里,添加函数实现:

void Controller::shortcutActiveCapture()
{this->startVisualCapture(0,QString());
}

「四、重新编译运行」

进入到刚才的编译目录,重新执行qmake,make编译就可以了。

cd build
qmake ../
make

编译好后可以试一下,生成的可执行程序运行后可以通过全局热键Ctrl+F5进行截屏编辑操作。

这个改动非常简单,通篇使用的是Ubuntu源内自带的工具和库。即使没怎么接触过qt的人,按照上面的套路也可以把这个工具轻松整出来。

如果是Qt老炮,可以通过本地编译出来或者本地安装的其他版本的qt编译这个程序,目前尝试qt5.5.1全局热键还是有点问题的,上面也提到了。我本地用的qt5.7没有这个问题。

存在问题:失去焦点就消失的窗体

理论上可以点击截图的地方,完全用不到全局热键,只有一种场景对全局热键截图这个功能有刚需:失去焦点窗体就消失的情况。比如,你在chorme浏览器的某个标签页上右键弹出一个对话框,你想截图这个对话框里的内容,但是一旦你鼠标去点击截图的按钮,这个对话框就会因为失去焦点而消失。这个时候就需要截图全局热键的功能来实现:或者对一些鼠标悬停才会显示的内容tooltips的截图也是这样:

但遗憾的是,在Linux平台上,这个全局快捷键截图仍然不能非常完美的解决所有“失焦即焚”窗体的问题

比如说你随便打开一个窗口,鼠标挪到左上角随便点一个选项卡(文件、修改、视图等等的),当他出现菜单时,你想截图这个菜单的内容,你就会发现全局热键不好使了:当这个红框窗体拿到焦点的时候,全局热键就不好使了,为了让全局热键生效让他失去焦点,这个窗体又会消失。进入到一种无法截图的尴尬境地。(我这张是对着虚拟机截出来的)

但这个问题并不是qxtglobalshortcut5实现的问题,而是X11本身的限制,一个直观的证据就是:在这种情况下,你键盘上的PrintScreen按键也会失效。

为了这个问题大概看了下qxtglobalshortcut5的Linux部分的实现,确实已经是x11提供的XGrabKey所能提供功能的极限了,如果硬要让自己全局热键的优先级高于窗口管理器,可能得写驱动级别的程序来搞。

存在问题2:输入文字不支持输入法

文字只能输入英文,这个也比较坑,目前还在想办法,目测可以用加载ibus/fcitx输入法插件的方式解决,后期解决后回来更新,有了解的大佬欢迎不吝赐教。

爆改 Linux 下最好用的截图工具!相关推荐

  1. linux下好用的截图软件下载,爆改 Linux 下最好用的截图工具!

    原标题:爆改 Linux 下最好用的截图工具! 公众号关注 "五分钟学算法" 设为 "星标",带你挖掘更多开发神器! 因为日常Linux办公,经常有截图顺带简单 ...

  2. 那些 Linux 下好用的 小工具 收集

    PS: 由于个人主要使用的平台为基于 Debian 的发行版[准确来说是基于 Ubuntu 的再发行版 Linux Mint],所以默认以 Debian 环境下介绍,不过由于大多数软件都是开源且在多个 ...

  3. linux下安装 tranmission BT 下载工具

    linux下安装 tranmission BT 下载工具 环境 记录 效果图 环境 centos 8 记录 安装 epel-release sudo dnf clean all sudo dnf in ...

  4. 20120520 Linux下mysql的自动备份工具

    文章摘自:http://hi.baidu.com/vb98/blog/item/2ed90cea835fa4cfd439c97f.html linux下的MySQL自动备份工具-第二版2011-10- ...

  5. Linux下压缩工具gzip和归档工具tar及其实战shell应用

    Linux下压缩工具gzip和归档工具tar及其实战shell应用       第一章:gzip的使用技巧 gzip [option]... file... -d: 解压缩,相当于gunzip; -# ...

  6. linux下grep文件内容搜索工具及基本正则表达式详解

    linux下grep文件内容搜索工具及基本正则表达式详解 grep命令: 根据模式(文本字符和基本正则表达式的元字符组合而成之匹配条件)搜索文本, 并将符合模式的文本行显示出来. 格式:grep [选 ...

  7. Perf -- Linux下的系统性能调优工具,第 2 部分

    https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/ Perf -- Linux下的系统性能调优工具,第 2 部分 刘 明, 软件工程师, 上 ...

  8. Linux下文件备份和同步的工具软件

    Linux下文件备份和同步的工具软件 1)通过本次实训,熟悉软件项目配置管理相关内容; 2)熟悉shell编程 makefile的应用. 3)掌握文件IO.标准IO库的使用,掌握Linux下多进程.多 ...

  9. Linux下四款常见远程工具比较

    摘要:Linux远程可不像Windows下那么方便,主要是连接的速度.显示的画质不能令人满意(延迟.撕裂).本文只是说一下我用过的四款远程工具.Anydesk官网:https://anydesk.co ...

最新文章

  1. [欧拉路]CF1152E Neko and Flashback
  2. 86.git使用 建立和克隆远程仓库
  3. Ardino基础教程 21_最简单最快控制LCD1602
  4. 福建2020年3月计算机二级报名时间,福建2020年3月计算机二级考试报名时间安排...
  5. vmware workstation17环境安装centos7
  6. 清华大学《操作系统》(九):进程和线程
  7. C++学习之路 | PTA乙级—— 1071 小赌怡情 (15 分)(精简)
  8. htt【RiPro网盘链接检测插件】目前支持四种常用网盘
  9. 语言怎么解决扭魔方_吧台高度没留够,怎么坐都变扭,直接加玻璃框没想到也能解决难题...
  10. 华为云举办AI经典论文复现活动,打造领先AI开发者学习社区
  11. C++socket编程(六):6.1 设置socket的阻塞和非阻塞
  12. 如何绘制高大上的词云图?
  13. android常用开源库分享
  14. Android 4.0平板,Android4.0.3系统_平板电脑_平板电脑评测-中关村在线
  15. 加密word文档脱壳教程
  16. 海淘也疯狂 跨境电商网站8月监测报告
  17. 7大不跳槽就会死的理由!
  18. SendMessage功能(中规中矩)
  19. Excel表格统计满足两列条件的总数:countifs方法
  20. linux开放外部端口访问

热门文章

  1. Android 获取双卡手机IMEI,IMSI,ICCID
  2. eps已经验证常用快捷键
  3. 手机购物,凡客诚品手机客户端,凡客手机版,VANCL,免费下载,送货上门,货到付款!...
  4. D3DWindower(游戏窗口化工具)v1.88 绿色版
  5. CSerialPort教程(2) - CSerialPort源码简介
  6. 软银NAO机器人视觉防抖系统
  7. 繁易平台直接对接监测点的数据(除MQTT方式外第二种方式)
  8. iframe去掉双滚动条
  9. 常见电子电路中英文对照一览(包括英文全称)
  10. 【数据产品案例】美团点评-点评管家“竞对分析”功能