- 博客(25)
- 收藏
- 关注
原创 2021-10-07
debian仓库小知识之main/contrib/non-free在debian系统中,使用apt update后,会在apt的lists目录(默认是/var/lib/apt/lists)生成对应软件源的仓库索引文件,如下:可以看到索引文件大致分三类: *_main_*、 *_controlb_*、 *_non-free_*这三种类型的意义如下:main表示最基础最主要且符合DFSG的包,可以看到这种类型的索引文件最大,说明里面的包数量最多controlb表示带有非自由依赖关系的DFSG兼
2021-10-07 21:38:32 246
原创 DTK日志管理RollingFileAppender
DTK日志管理RollingFileAppender前言简介RollingFileAppender自定义自定义日志文件路径自定义日志文件格式自定义日志文件大小自定义滚动频率RollingFileAppender使用前言在 DTK日志管理DLogManager讲了DTK默认的日志管理器DLogManager,它提供了一个默认的实现,特别适合编写deepin或者uos应用。但是如果我们需要对日志输出做自定义配置怎么办呢?比如配置单个日志文件的大小、回滚日志文件的个数等。DTK提供的RollingFile
2021-01-10 12:15:21 631 1
原创 DTK日志管理DLogManager
DTK之DLogManager简介使用简单用法效果输出到终端输出到文件简介DLogManager是DTK提供的日志管理器,提供了日志输出到文件和终端的功能。使用简单用法编写DTK程序时,使用DLogManger很简单:如果需要将日志输出到文件,只需在main函数中调用:DLogManager::registerFileAppender();类似的,如果需要将日志输出到文件,在main函数中调用:DLogManager::registerConsoleAppender();如果既要输出
2021-01-09 21:50:14 363
原创 QGuiApplication底层鼠标处理(二)QSocketNotifier在事件循环中触发activated信号
QGuiApplication底层鼠标处理(二)QSocketNotifier在事件循环中触发activated信号前言QSocketNotifier简介QSocketNotifier activated信号的触发将QSocketNotifier加入侦听列表在processEvent中轮询被侦听设备的状态processEvent与事件循环的关系QCoreApplication::execQCoreApplication::execQEventLoop::execQEventLoop::processEven
2021-01-03 23:02:29 1305 2
原创 QGuiApplication底层鼠标处理(一)使用QSocketNotifier建立侦听连接
QGuiApplication底层鼠标处理(一)使用QSocketNotifier建立侦听连接读取外设信息建立外设连接init_pluginsQEvdevMousePluginQEvdevMouseManagerQEvdevMouseHandlerQWindowSystemInterface总结读取外设信息鼠标、键盘、触屏等外部输入设备是以Plugin的方式加载的。在QGuiApplication初始化时从argv和环境变量QT_QPA_GENERIC_PLUGINS读取所有的插件信息,里面就包括鼠标
2021-01-02 22:34:45 1306 1
原创 QScrollArea滚动条的滑块一直显示
QScrollArea滚动条改为一直显示QScrollAreaQScrollArea简介Qt::ScrollBarPolicyQt::ScrollBarPolicy::ScrollBarAlwaysOffQt::ScrollBarPolicy::ScrollBarAlwaysOnQt::ScrollBarPolicy::ScrollBarAsNeeded如何让滚动条的滑块一直显示QScrollAreaQScrollArea简介QScrollArea表示一个滚动区域。当里面的widget显示不下时,就
2020-11-12 22:14:08 2043 1
原创 QT moveToThread解析
目录简介源码分析判断是否可以执行移动动作执行移动动作调用moveToThread_helper调用setThreadData_helper简介每一个QObject子类都会关联到一个具体QThread线程上,QObject有一个QThreadObject数据成员,该成员在Qobject构造时关联到具体的线程上:class Q_CORE_EXPORT QObjectPrivate : public QObjectData{ ... QThreadData *threadData; // id of
2020-10-12 21:37:43 6536 2
原创 QT信号槽原理(二)moc代码中的信号槽部分
目录前言moc代码详解原始代码emit宏moc后代码moc出的信号函数QMetaObject::activatedoactive第一步:获取该信号的所有连接第二步:遍历每一个连接第三步:判断发送者和接收者是否在同一线程第四步:处理queue和blockqueue连接方式第五步:处理直接连接补充QMetaCallEvent的处理QMetaObject::metacall前言要弄清楚信号槽原理,必须得了解qt moc机制,本文我们重点解析信号槽部分,qt元数据不深入。QT自己定义了很多关键字,像signa
2020-09-13 22:35:31 2232 1
原创 QT信号槽原理(一)connect函数
目录2个类型和1个签名Qt::ConnectionTypeQMetaMethod::MethodType方法签名connect函数源码解析函数原型:第一步:参数检查第二步:获取信号和槽的index第三步:检查信号和槽的参数是否匹配第四步:检查信号参数类型第五步:创建连接对象检查Qt::UniqueConnection创建connection对象,并填充各个数据将connection对象添加到sender中2个类型和1个签名Qt::ConnectionType信号的连接类型Qt::DirectCon
2020-09-12 15:12:32 4132 1
原创 宏定义的#和##
‘#’宏定义中一个#表示右侧的符号转化为字符串,比如:#define STR(x) #xQString s = STR(3)编译ok,s值为"3"。之前在看QT源码时,发现了下面的宏定义:# define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)#define QT_STRINGIFY2(x) #x#define QT_STRINGIFY(x) QT_STRINGIFY2(x)第一行的好理解,就是把文件行号拼起来,后面两行
2020-09-07 17:57:55 3242 2
原创 QT对象管理系统
QT对象管理系统前言QObject对象管理QWidget对象管理QLayout的中转作用回归QWidget的怀抱总结前言我们在写QT界面代码时,经常会像下面这样只有new,没有deleteWidget::Widget(QWidget* parent) : QWidget(parent){ auto label = new QLabel("test", this); auto button = new QPushButton("click"); auto layout
2020-08-17 21:48:36 856
原创 Qt deleteLater原理
使用场景我们知道,我们可以对某个对象调用deleteLater来延迟删除这个对象,比如我们在QNetworkAccessManager的finished信号中删除QNetworkReply: connect(networkManager, &QNetworkAccessManager::finished, [=](QNetworkReply* reply) { reply->deleteLater(); if () { qDebug(
2020-08-04 23:53:54 2552 1
原创 使用7z释放ISO中的某个文件
前言不知道大家有没有遇到这种情况,我需要读取ISO中某一个文件的内容,但是由于这个ISO很大,如果整个解压再去读目标文件的话,那解压过程耗时很长,整个操作可能需要几十秒,这当然是不能接受的,那要怎么处理呢?解压命令我们可以使用7z命令只解压出目标文件,解压一个文件很快,命令格式是下面这样:7z x ISO文件 -o输出目录 iso中文件的相对路径 -aoa-o后面紧跟输出目录,没有空格。举个例子,下图中可以看到ISO中live目录下有一个filesystem.size文件:解压出这个文件的
2020-08-04 23:23:02 1579
原创 使用QEventLoop将异步操作变成同步操作
前言在Qt事件循环详解(一)中讲到,可以用QEventLoop来阻塞当前函数并开启事件循环,在UI程序中,我们可以用这种方法将一个异步操作转化成一个同步操作。异步调用举例我们来看一个例子,我们向服务器请求服务器时间,异步的方式,我们的写法是这样的:void Helper::getServerTimeAsync(){ auto networkManager = new QNetworkAccessManager; connect(networkManager, &QNetwo
2020-08-04 22:53:10 1478
原创 Qt事件循环详解(一)
Qt事件循环详解事件循环简介QT事件循环过程启动事件循环QEventLoop事件循环QEventDispatcherUNIX事件处理QCoreApplicationPrivate事件处理事件处理过程QApplication的notify处理事件过滤器QApplication的事件过滤器QObject的事件过滤器对象的event方法结尾事件循环简介UI程序之所叫UI程序,是因为需要与用户有交互,用户交互一般是通过鼠标键盘等的输入设备,那UI程序就需要有能随时响应用户交互的能力。一个C++程序的main函
2020-07-26 18:27:58 6184 1
原创 DTK进度条控件DWaterProgress
DTK进度条控件DWaterProgress简介用法注意点1. 需要手动update2. 只显示百分号?其它简介DTK提供了好几种漂亮的进度条控件,我们来看下其中的DWaterProgress。首先看下效果:看起来还是不错的吧。跟名字一样,这是一个像水球一样的进度条控件。用法使用很简单,使用setValue(newValue)设置新值,然后调用update()或者repaint()。下面看一个比较完整的用法:MainWindow::MainWindow(QWidget* parent)
2020-07-13 23:20:41 374 1
原创 UOS系统VS Code配置Go环境
UOS系统VS Code配置Go环境目录前言环境配置安装VS Code安装Go配置go环境gocodegopkgsgo-outlinego-symbolsgurugorenamegotestsgomodifytagsimplfillstructgoplaygodoctorgocode-gomod**godefgoreturnsgolintgodlv目录前言目前go语言的IDE目前最好用的是JetBrain的GoLand,但是,是收费的,免费的只有30天的试用期。个人觉得,IDE用的最多的可能是自动补
2020-07-13 00:52:29 2825 1
原创 vim神器插件youcompleteme一键安装之vimplus
参考:https://www.jianshu.com/p/75cde8a80fd7效果:下载https://github.com/chxuan/vimplus.git安装git clone https://github.com/chxuan/vimplus.git ~/.vimpluscd ~/.vimplus./install.sh
2020-07-12 22:13:02 1058 1
原创 QSettings写General组会出现百分号%问题解答
现象我写了一段代码来创建一个ini文件,并期望会创建一个General段,里面有我加的两个配置,源码如下:#include <QSettings>#include <QDebug>int main(int argc, char *argv[]){ QSettings settings("test.ini", QSettings::IniFormat); settings.beginGroup("General"); settings.setValu
2020-07-01 23:56:40 1283 1
原创 QT json基本用法
目录json格式简介QJson模块介绍QJsonValue、QJsonObject、QJsonArrayQJson模块基本用法QJsonValue支持的类型构建QJsonObject构建注意取值、 查找、遍历、删除QJsonArray构建取值、删除、修改、遍历QJsonDocument之序列化和反序列化序列化反序列化总结json格式简介json可以理解为一种多级键值对的结构,例如:{ "name" : "Xiao Ming", "age" : 10}上面这个简单结构表示一个学生信息,包含2个
2020-06-27 23:13:22 6740
原创 gdb的基本用法
目录gdb的基本用法设置断点删除断点禁用启用断点逐行调试查看变量值查看调用栈显示源代码gdb其他用法条件断点查看寄存器的值查看汇编动态显示当前代码和汇编总结gdb的基本用法gdb的基本用法比较简单,一般只要掌握像在vs调试那样设置断点、逐行调试、查看变量值和调用栈等即可。设置断点在说设置断点前,先讲下查看断点,使用info break命令可以查看所有断点。设置断点使用break或者b命令。源程序:int badFunc(int i){ int r = i; if (i%2 =
2020-06-21 22:04:26 2187
原创 超轻量级c++单元测试框架Catch2
目录与googletest简单对比Catch2简单用法环境配置第一个测试用例Catch2之SECTION其他BDD(行为驱动开发)方式组织用例指定运行部分用例总结与googletest简单对比之前工作中做单元测试,一直用的是googletest,使用时只需要下载源码编译出库,在测试工程中引用即可,googletest提供了很多宏来让我们很轻松的组织测试用例。前段时间公司让研究适合项目的单元测试框架,然后就发现了Catch2,Catch2比googletest使用更简单,源码就一个头文件,使用时只需要将
2020-06-21 16:52:00 2860 1
原创 C++方法名称还原命令c++filt
c++编译代码时,会将函数名做一个变换,变换后可能是这样:_ZTIN6DMusic3Net5GeeseE,不太容易从这里看出原始方法名称。有时遇到运行出错的问题,报一个_ZTIN6DMusic3Net5GeeseE符号未找到,就不太容易定位是哪个库出问题了(可惜我举得这个例子很明显可以看出)。今天看到大佬说可以用c++filt看原始名称,试了下,果然好用...
2020-06-15 22:58:49 757
原创 配置linux终端路径显示
有没有觉得终端上一大半都被路径显示占着很烦呢?终端提示符路径和标题栏路径由环境变量PS1控制。在PS1中涉及3个标识\u、\h和\w:\u 表示当前用户名username\h 表示当前主机名hostname\w 表示当前工作目录workingdirectory配置了\w就会显示当前路径,如果进入了比较深的目录,那终端上一大半都会被路径填充,像下面这样:我们只需要把控制命令行的\w换成\W\W 表示显示当前文件夹名称这样终端命令行显示很简洁,我们又可以从标题栏看出当前路径,效果如下
2020-06-15 22:46:30 4223 1
原创 函数中的代码尽量处于同一逻辑层次
在写新代码或者重构旧代码时我们可能会遇到调整函数结构的问题,我们来看下面这个例子void 吃饭(){ 买1杯豆浆 买2个包子 吃1个包子 喝0.5杯豆浆 吃1个包子 喝0.5杯豆浆 煮1小碗米饭 买2个番茄 买1个鸡蛋 买1块儿姜 买1头蒜 炒1人份番茄炒蛋 吃米饭 买1条鲤鱼 买200嫩豆腐 ...}阅读这段代码时会展现很多细节,不利于快速掌握整体逻辑,很明显应该封装子函数,上面这个例子举得很直白,可以很容易整理出同一层次的几个子逻辑:void 吃早饭();
2020-06-07 14:39:27 234
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人