自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(167)
  • 资源 (12)
  • 问答 (5)
  • 收藏
  • 关注

原创 QTAV的编译、使用及遇到的问题

最近有个功能需求,界面可以直播显示某个特定摄像头的实时画面,通过对Qt本身的 QMiediaPlayer,和其他一些在网上找到的组件做了一些对比,最终选择了QtAv作为我们的组件使用。QtAV 是一个基于 Qt 和 FFmpeg 的跨平台、高性能多媒体播放框架。

2024-01-10 23:46:21 1284

原创 Qt 的流式布局 FlowLayout

一直苦寻于一个比较智能的布局方式,能够满足软件界面进行resize的时候,对已经存在的布局进行重新布局。能够合理的判断界面的size,在界面放大的时候,显示的item的行数减少,相反,界面缩小的时候,显示的 item 行数能相应的增加,也就是能够满足界面是充盈的并且不会有超出界面的显示 item。而我们已知的在Qt中已有的几种布局方式,都没办法直接达到我们的预期。比较接近的是栅格布局,但也要进行二次开发才能满足需求。这种方式比较适合每个 item size 相同的情况,实现的原理也就是在调用 resizeE

2024-01-06 14:53:41 1409

原创 Qt自定义的ColorDialog--仿QColorDialog

这样设置之后,按照预想应该是正常的,没想到的是,运行起来之后,直接堆栈溢出了。因为设置之后,其他的也改变了value,改变了就会发信号,发了信号我们就又设置了,设置了就又发信号,所以就一直在这样的循环中重复了起来。刚开始时,确实有种无处下手的感觉,后来突然想想,当你不会的时候,如果手边刚好有现成的差不多的东西,不仿去抄一抄,所以,我就看了下。设置颜色值的时候需要进行一次转换,因为这个HSV空间的最大值是359和255,所以要根据界面的大小转换成在HSV空间对应的数值。的背景色为对应的渐变色。

2023-05-27 21:32:46 1269 1

原创 Qt实现undo和redo功能--连续后退

这就是在某个需要触发的时刻记录下当前的状态和这一状态前面的那个状态,然后ctrl+z的时候设置为当前状态的前一的状态,ctrl+y的时候设置为当前状态的后一状态。

2023-05-17 21:42:28 1228

原创 QRegion 限制 QPainter 的绘制区域

一般在绘制的过程中,我们有很大的可能性是需要擦除的,擦除的时候也只能擦除我们目前在画的颜色区域,并不会将所有的都擦除。看着这个需求的时候,我首先想到的是图层,就是类似PS的图层一样,就是将这张图片中的每一种颜色单独提取出来另作一种图层,这样就会得到多张只包含一种颜色的图片,这些图片的其他区域是透明的。有一张图片,这张图片上面被我用不同的颜色画了不同的区域,然后我想选择这张图片中的某一种颜色,只在这种颜色所在的区域内进行绘制或者用橡皮擦擦除这种颜色,而不会影响其他颜色。

2023-05-16 22:30:14 703

原创 QImage 如何设置图片的透明度

最近遇到了一些这样的需求,在窗口可以调节显示图片的透明度,但是不能影响其他图片。一个窗口显示的图片并不是一张,而是多张通过绘制的形式叠加起来的。可以理解为类似图层。就像下面这个组合一样,想法是在拖动右侧透明度的滑条的时候,只修改上层图像的透明度,并不会修改低层背景图的透明度。

2023-04-28 00:10:10 2344

原创 Qt QImage scaled方法缩放中的问题

或许你已经发现问题了,因为我们前面进行图像的缩小时,使用缩放比例是根据鼠标在屏幕上的位移计算得来的,这个缩放比是个double类型的数值。判断的方式是首先按照现有尺寸的长宽比,和给定size的高,计算出缩放之后的长。对比一下,只是一个简单的数值的修改,可比写了一个函数的方法简单多了, 而我,在计算了长宽比之后,还是选择了最初的size,多走了很多路。修改方法也是比较简单的,只是单纯的在计算之后,判断一下调用了 scale 之后的QSize和预期的size的大小,并且选择了较大者。

2023-04-16 21:15:05 2019

原创 QComboBox文字居中的几种实现方式

不知道你有没有遇到过这样的需求,将一个QComboBox的文字居中显示。我最近遇到了这样的需要,主要是要和其他的控件显示进行匹配,这也就要求我们必须将下拉列表的文字居中显示。这种需求可能实现的方式会有好多种,但我一直坚信,能用原生的就用原生的,或者在原生的控件之上进行一些特例化的改动,让其满足我们的需求是最简单的方式,并且不会过多的影响样式表设置。所以这儿我还是选择了QComboBox,而我们要做的事情就是怎样将他的文字居中显示。...

2022-08-26 18:02:45 7515 2

原创 C++经验(十二)-- 复合、public继承、private继承

复合是类型之间的一种关系,当一种类型的对象包含了其他种类型的对象的时候,我们就可以说这是复合关系,复合关系也是我们在画UML类图的时候经常碰到的一种类与类之间的关系。通常级别比复合低,但当派生类需要访问基类的protected成员,或者需要重新定义继承而来的虚函数时,私有继承是比较好的选择。上面的这个例子我们构建的就是一种has-a的关系,因为,我们可以说,人有一个地址,但不能说,人是一个地址。因为模版库的set在实现的时候为了在一些操作上保证对数时间的效率,每个元素都会有三个指针的额外开销。...

2022-07-28 20:45:05 612

原创 Qt自定义控件--pagenavigation(页面导航)

自定义组件是我们开发过程中一定会遇到的情况。实现的这个页面导航具备了基本的页面导航的功能,以及可以切换的样式表。

2022-07-14 22:07:35 1685 1

原创 Qt自定义SearchLine控件--实现按钮及相应功能

今天看一个搜索框的自定义。实现的功能是:效果如下:我们选择继承QLineEdit类来实现,这样是最简单最快的方式。在构造的时候调用,在QLineEdit 上new 一个 QPushbutton,并且将QPushbutton移到 QLineEdit 的末尾。使得该按钮被点击的时候发送 textEdit 信号即可。...

2022-07-07 21:26:16 564

原创 Qt自定义DateTime控件--实现日历及时间选择器自定义

怎样能够完全地实现一个不用其他控件就能正常使用的控件。最近尝试了下,使用了Qt的基础控件实现了一个完全自定义的日历控件,顺便改良了一下以前的时间选择器,测试效果还可以。终于实现了自定义的DateTime控件。......

2022-07-06 21:46:31 9467 10

原创 C++经验(十一)-- (inlining)内联函数的使用

编写代码过程中使用函数,能够降低代码的重复率,特别是在一些重复性比较高的代码中,也能够用降低运行程序的体积。但不可避免的也会带来一些程序运行上的时间消耗。函数执行的时候,首先要在栈上为形参和局部变量申请内存,同时也要将实参的值复制给形参,最后还需要将函数的返回地址写入栈,以便函数结束运行后,程序能够知道应该回到哪儿继续执行。最后才跳转到函数内部进行执行。执行完还要进行内存的析构等资源的回收。.........

2022-06-29 08:23:00 826

原创 C++经验(十)-- 保存成员函数的函数地址,避免switch-case的大量使用

当一个类中使用了大量的if-else 或者 switch-case代码的时候,就需要考虑要不要用策略模式了。或者以某种方式存储成员函数的地址,方便在以条件进行调用的时候能够更方便、快捷的找到函数并进行调用。在造轮子的过程中,一定要学会偷懒,可能一次偷懒,就会为你节省大量的时间和篇幅。...

2022-06-25 14:23:55 710

原创 C++经验(九)-- 注意函数的异常安全性及资源的管理问题

异常安全函数保证即使发生异常,也不会泄漏资源或任何数据被破坏。

2022-06-21 20:20:07 816

原创 C++经验(八)--避免返回的句柄指向类的内部成员

避免返回类内部成员的句柄,可增加类的封装性。降低指针或对象被空悬的风险。

2022-06-20 19:46:19 166

原创 C++经验(七)-- pass by value 和 pass by reference to const 的问题

缺省情况下,C++以 by value 方式传递参数。函数参数都是以实参的副本为初值,如果返回对象的话,返回的也是返回参数的一个副本。而这些副本都是由对象的copy构造函数产出。这也就使得pass by value的操作比较耗时。那么如果我们传递一个对象的引用或者是返回一个对象的引用呢?会不会降低这些耗时?.........

2022-06-14 08:20:15 617

原创 Qt 信号和槽机制

Qt在不同对象之间使用信号槽通信的,那么什么是信号槽,信号槽的本质知道吗?他们之间是怎么通信的,既然已经有了回调,为什么还要有信号槽?信号槽的第五个参数决定了他们的关联方式,队列关联和阻塞队列关联知道吗?阻塞是怎么阻塞的。能不能详细说说。

2022-03-30 21:34:49 4305

原创 C++经验(六)-- 以对象的形式管理资源

所谓资源,就是程序在运行过程中从系统中借用的东西,一旦用了,当你不用的时候,就必须得还回去。C++最常见的资源就是动态内存分配,也就是我们以new或者malloc等从系统中动态分配的内存,当然资源还包括其他,比如文件描述符、socket、互斥锁、数据库连接等。那么,为什么要以对象的形式管理资源呢?以对象管理资源,是我们为了对抗资源泄漏而挖的一道战壕。主要是因为:以对象管理资源的概念常被称为:“资源取得时机便是初始化时机”。(Resource Acquisition Is Initialization

2022-02-19 08:37:42 523

原创 C++经验(五)--在赋值操作中处理自我赋值和令其返回指向 *this 的引用

我们经常为了方便和偷懒,将内置类型的赋值操作可以写成链式操作。int x, y, z;x = y = z = 10;同样地,我们曾经写过的实现,strcpy,strcat等这些函数,总是会返回一个指针。返回指针的目的也是为了方便我们进行链式操作。char* mystrcpy(const char* src, char* dst){ assert(src != NULL && dst != NULL); if(*src == *dst) { return dst; }

2022-01-29 13:11:39 936

原创 C++经验(四)-- 基类构造函数和析构函数中调用virtual虚函数?

class Base{public: Base(); virtual void oneFunction() = 0; ...};Base::Base(){ ... oneFunction();}class Derived : public Base{public: Derived(){}; virtual void oneFunction() { std::cout << "Derived oneFunction

2022-01-25 20:29:52 1681 1

原创 C++经验(三)--为多态基类声明virtual析构函数

在设计模式工厂(factory)模式中,我们通常会返回一个指针,指向一个子类。即返回一个base class的指针,指向一个新生成的derived class的对象。class Base{public: Base(){} ~Base(){} ...};class Derived1 : public Base{...}class Derived2 : public Base{...}class Derived3 : public Base{...}像下面的函数,返回

2022-01-16 11:58:50 348

原创 C++经验(二)--编译器默认生成的函数

我们定义一个空类。编译器会为我们默认生成一些函数。如果我们没有声明,编译器会帮我们生成一个拷贝构造函数、一个拷贝赋值操作符和一个析构函数。同时如果我们声明构造函数的话,也会生成一个默认的构造函数。class Empty{};上面我们定义了一个空类 Empty,编译器会帮我们生成下面,也就是说, 我们相当于声明了一个下面的类。class Empty{ public: Empty(){} Empty(const Empty& rhs){...} ~Empt

2022-01-07 21:59:26 1057

原创 C++经验(一)-- const关键字的用法

const允许我们指定一个语义约束(不该被改变的对象),编译器会强制实施这项约束。const的作用也是比较多的。在class外修饰global或者namespace作用域中的常量。修饰在文件、函数、区块作用域中的被声明为static的变量。修饰classes内被声明为static或者non-static的成员变量。修饰指针或者指针所指物。char test[] = "this is test.";char* p = test;

2021-12-31 18:33:50 683

原创 stl使用中的经验(十八)--使用函数对象作为算法的参数

使用高级语言编写程序的缺点是,越抽象,代码的效率越低。例如下面的例子,我们将一个由小到大的存储10000000个double类型的vector调用sort算法排序,并且让他的顺序改为由大到小。typedef vector<double> DVec;typedef vector<double>::iterator DVecIter;DVec dv;clock_t t1 = clock();cout << "time 1 " << t1 <&l

2021-12-20 22:28:49 448

原创 stl使用中的经验(十七)--查找算法count/find/binary_search/lower_bound/upper_bound和equal_range

很多时候,我们都能遇到在一对迭代器标识的区间中查找一些信息,stl提供了比较多的查找算法,而我们也要根据不同的情况选择不同的算法进行查找,但基于的目的总是快速、简单和高效。这样也就有了我们在选择具体的查找策略时,指定的区间是否排序是选择算法的一个至关因素。如果区间是排序的,那么选择binary_search/lower_bound/upper_bound和equal_range(运行时间是对数)则能够获得更快的效率。但如果不是排序的,那就只能在count、find及其衍生算法(线性时间消耗)中选择。虽然

2021-12-17 00:32:28 941

原创 stl使用中的经验(十六)--算法调用优于手写循环

每一个算法都至少需要使用一对迭代器来指定一个对象区间。算法的操作也是在这个区间上运行,算法是要在这个区间上,检查每一个对象,是否满足自己的期望。因此,算法的本质就是运行一个简单的循环,在指定的区间内遍历每一个对象,并对对象做出自己期望的检查或者调用。但并不是所有的算法都会完整的遍历完整个区间,比如,find和find_if。这两个算法,如果在区间的某个位置找到了自己想要找的对象,则会直接返回。但无论如何,它还是进行了小循环的遍历。只有当他遍历完区间中所有的对象后,他才会知道我们想要找的对象并不存在。如

2021-12-10 01:15:05 540

原创 stl使用中的经验(十五)-- 确保less<T> 和 operator< 有相同的语义

我们都知道,stl容器中的是有默认的排序函数的,默认排序less<T>,一般都是按照大小排序的。如果存储的是自定义的元素,并且假设我们的排序因子有多个,则主要是看我们自定义类中的 operator< 函数是怎么书写的。我们首先看个例子。#include <iostream>#include <set> #include <algorithm> #include <iterator>using namespace std;cla

2021-11-28 20:01:13 388

原创 stl使用中的经验(十四)--ptr_fun、mem_fun、mem_fun_ref

首先我们看个例子。#include <iostream>#include <vector> #include <algorithm> #include <iterator>using namespace std;class Widget{ public: Widget(int a) : m_a(a) { } int value() const { return m_a; } bool test() { retur

2021-11-28 19:54:52 852

原创 stl使用中的经验(十三)--若类是一个函数子,则应使它可配接

我们先看一个例子:#include <iostream>#include <vector> #include <algorithm> #include <iterator>using namespace std;class Widget{public: Widget(int a) : m_a(a) { } int value() const { return m_a; }private: int m_a{0}; }

2021-11-28 19:45:25 583

原创 Qt实现时间范围选择

以前我们写过一篇利用Qt ScrollBar实现滚动屏时间选择器的文章,也写过一篇QComboBox自定义设置 - 下拉列表自定义为表格的文章,今天我们就利用前面已经完成的这两篇文章实现一个时间范围选择的控件。首先我们看下效果。看完了效果之后,我们对上面的这个控件进行分解:最外层是一个QComboBox控件,只是该控件是我们自定义之后的下拉框中是一个QWidget,并且用了两个相同的datetime来实现时间选择的起始每个datetime中均有一个QCalendarWidget(日期)控件和一

2021-11-21 16:52:39 5560 10

原创 stl使用中的经验(十二)--确保判别式是纯函数

我们先看两个概念:判别式:是一个返回bool类型(或者可以隐式的转换为bool类型,比如 int)的函数。纯函数:是指返回值仅仅依赖于其参数的函数。比如:假设f是一个纯函数,x,y是其参数,f(x,y)的返回值只有当x或y的值发生改变的时候才会发生改变。所以在C++中,纯函数所能访问的数据仅限于参数以及常量(在函数生命周期内不会被改变)。判别式类,是一个函数子,其operator()函数是一个判别式。也就是说,他的operator()函数返回true或者false。stl中能接受一个真正的判别

2021-11-21 14:49:32 462

原创 Qt自定义表格的实现,表格数据的读取、选择,内容提醒

前面我们有说过一篇,Qt自定义表格的文章,主要集中体现在自定义表头上,其实在Qt的很多界面开发上,自定义表格是很常见的一种操作。今天我们就看看怎么样自定义一个表格同样的,我们沿用上一个自定义的方式,使用两个影藏了表头的QTableWidget进行组合表格。而为了能够实现表头复选框的选中(半选中)和未选中三种状态的切换,并且能够缓存每行表格的数据,这次我们使用了自定义的复选框。如下,我们自定义CheckBox,继承自QCheckBox,并且重写他的mouseReleaseEvent 函数。重写该函数的目的

2021-10-31 10:04:27 5706 3

原创 stl容器使用中的经验(十一)--erase-remove删除存储指针的容器元素

我们首先看个例子。#include <iostream>#include <vector> #include <list>#include <algorithm>using namespace std;class Widget{public: Widget(int a) : m_a(a) { if(a % 2 == 0) { m_isMeasured = true; } } bool isMeasured() {

2021-10-26 23:39:26 857

原创 stl容器使用中的经验(十)--remove并不能删除容器中的元素,要结合erase方法使用

在我们刚开始接触stl标准容器的时候,或者说只是看了某些方法的字面意思就对该方法的作用进行一些猜测,这样其实是有很大缺陷的,比如今天要说的remove方法,看字面意思,我们很容易理解为是从容器中删除什么。但其实呢?我们先看下remove方法的申明和定义。template <class _ForwardIter, class _Tp>_ForwardIter remove(_ForwardIter __first, _ForwardIter __last, const _Tp& __

2021-10-21 22:44:16 301

原创 stl容器使用中的经验(九)--确保容器的目标容量足够大

stl容器在有新元素插入(insert、push_back、push_front等)进来的时候,它会自动的扩充存储空间用来存储这些新元素。但所有的情况下都是这样的吗?我们来看一个例子。#include <iostream>#include <vector> #include <algorithm>using namespace std;int transmogrify(int x){ return ++x;}int main(){ typed

2021-10-21 22:32:41 172

原创 stl容器使用中的经验(八)对于逐个字符的输入请考虑使用 istreambuf_iterator

先来看个例子:ifstream inputFile("ints.dat");list<int> data(istream_iterator<int>(inputFile), istream_iterator<int>());上面的这两行代码,貌似是将两个 isteam_iterator 迭代器传给list容器的构造函数,从而将文件中的数据拷贝到容器中。但是,结果真的如我们所料吗?首先我们看下下面的代码。int f(double d);int f(double

2021-10-19 22:34:12 288

原创 stl容器使用中的经验(七)--iterator 优于 const_iterator、reverse_iterator、const_reverse_iterator

1、iterator 优于 const_iterator、reverse_iterator、const_reverse_iterator一般来说,标准stl容器都提供了4中迭代器。对于一个容器container<T>而言,iterator相当于 T* ,const_iterator相当于 const T*;我们以map为例,其他的容器也大差不差的实现了下面三个函数的功能。iterator insert(iterator position, const value_type& __x)

2021-10-16 08:31:44 644 1

原创 stl容器使用中的经验(六)--考虑 map::opreator[]和map::insert()的效率问题

结论 :当效率至关重要时,如果要更新一个容器的值,优先选择map::operatot[],如果需要插入一个新的元素,则优先选择map::insert()。假设定义如下类:class Widget{public: Widget(); Widget(const double& val); Widget& opeartor=(double val); ...}创建一个从int到map的映射容器。std::map<int, Widget>

2021-10-11 22:31:40 434

原创 stl容器使用中的经验(五)--不要随意修改set或者multiset的键

1、不要随意修改set或者multiset的键对map和multimap来说,直接修改键会在编译器这一层报错。map<_key, _value> m;m.bengin()->first = 10; //编译失败主要是因为对于map和multimap来说,他们的元素类型是pair<const _Key, _Tp>也就是说,_Key是const类型的,不允许修改。而对set或multiset来说,他们的元素的类型是 _Key,而不是const _Key的。为

2021-10-10 15:55:00 130

translation.zip

Qt 不重启程序多语言切换

2021-06-13

untitled.zip

Qt 自定义事件的相关测试代码

2021-05-28

untitled4.zip

Qt中QListWidget控件调用itemWidget接口获取QListWidgetItem提升的QWidget返回Q_NULLPTR验证测试用例,针对问题进行分析

2020-05-22

BtnMenu.zip

Qt 两种模式生成按钮菜单,一种是直接将按钮设置为菜单模式,另一种是结合QWidget生成菜单,方便使用

2020-04-11

PictureHandle.zip

Qt 图片处理,线程对图片进行绘画,压缩,保存,读取压缩后的图片,对使用QImage类对象读取压缩后的图片文件错误进行验证

2020-04-06

Qt中QSS样式表学习示例

学习QSS样式表示例,包含QSS样式表设置的各种方法以及自定义属性的使用,能够帮助理解QSS样式表。 可以根据我的文章联合学习。

2020-01-07

DateTime.zip

实现Qt滚动屏,水平方向和垂直方向,能够使用鼠标滚轮或鼠标拖动的方式完成滚动,界面比较简单,当前值改变,支持信号槽通知,适用于时间选择器等

2019-12-21

pyqt实现虚拟小键盘

使用pyqt5实现的虚拟小键盘,采用信号槽的通信机制

2016-08-01

windows下D-Bus安装包

Windows下的D-Bus安装包

2016-07-12

基于Qt实现音频播放器

实现了音频播放器的基本功能,能够同时添加多个文件,使用QMEdiaplayList和QMediaplayer类实现

2016-05-12

zlib.zip库文件

zlib库文件

2016-03-22

zlib128-dll.zip

zlib库dll文件

2016-03-22

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除