好物分享:简单改写一个Linux下好用的截图工具

2024-04-01 21:18

本文主要是介绍好物分享:简单改写一个Linux下好用的截图工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为日常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 

五、中文输入法支持
在Linux下Qt编译出来的程序默认都不支持切换输入法,导致截图编辑的时候无法输入中文。
解决方案很简单:sudo apt-get install fcitx-frontend-qt5
安装这个库之后,再重新编译flameshot程序就可以了。

这个解决方案的原理,实质上是安装了/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so这个库,有了这个库,再使用系统的Qt编译出的程序就都可以使用fcitx类型的中文输入法(搜狗就是这种)
如果你是用的是自己安装的其他版本的Qt,那么你需要:

  • 下载fcitx-qt5的源码
  • 用自己的Qt编译源码生成libfcitxplatforminputcontextplugin.so
  • 把这个库放到你qt安装目录的:qt/5.7/gcc_64/plugins/platforminputcontexts/目录下 (我这里是5.7)
  • 重新编译程序就可以了
  • 此处参考:https://www.cnblogs.com/fox-Benjiaming/p/11738092.html:

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

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

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

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

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

但遗憾的是,在Linux平台上它不能非常完美的解决所有“失焦即焚”窗体的问题,比如说你随便打开一个窗口,鼠标挪到左上角随便点一个选项卡(文件、修改、视图等等的),当他出现菜单时,你想截图这个菜单的内容,你就会发现全局热键不好使了:
在这里插入图片描述
当这个红框窗体拿到焦点的时候,全局热键就不好使了,为了让全局热键生效让他失去焦点,这个窗体又会消失。进入到一种无法截图的尴尬境地。(我这张是对着虚拟机截出来的)

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

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

这篇关于好物分享:简单改写一个Linux下好用的截图工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868159

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和