Qt Creator

由“Qt程序运行一段时间后崩溃”引发的“opancv库中Mat::clone()函数”在多线程下的注意事项

怎甘沉沦 提交于 2021-01-04 08:00:20
问题描述 过程1:从相机中获取图像数据,然后存放到一个cv::Mat对象中(该对象是全局变量,用来交换数据)。由相机的回调函数自动调用。 过程2:将上述的全局变量拷贝并转换qimg,放到Qt界面上显示。该过程由定时器调用。 然后程序会在运行一段时间后,出现“程序异常结束。The process was ended forcefully.”。运行的时间长短不一。 问题解决与分析 由于QtCreator的编译器选的是MSVC,而调试器选只有GDB(查了下好像需要CDB)。所以无法debug,只能一点点排查。 测试定时器时间越短,出现问题越快。猜测是多线程下访问冲突。 输出线程id查看,使用std::this_thread::get_id()获取当前线程的ID,发现相机写入Mat对象的过程的线程号 和 定时器调用的读取Mat对象的线程号不一样。这说明相机的SDK在获取图像数据的部分是创建了新的线程进行的。 可是读写应该不冲突,所以看看opencv的Mat::clone()方法。 inline Mat Mat::clone() const { Mat m; copyTo(m); return m; } // 噢 原来是调用的cv::copyTo方法,等等,上面有个const,这下明白了,在拷贝的时候是不允许修改值的,如果正在拷贝,此时相机写入线程正好获取了相机数据,准备写入

QT Creator 转VS2017+QT工程

拟墨画扇 提交于 2020-12-16 06:59:07
因为刚学QT 不熟悉其QT Creator 的开发环境,所以打算用VS2017来开发,因为要跨平台所以打算写出来的代码可以放在linux上编译。 这时就需要将VS2017的工程转换成QT Creator 可以编译的工程 由于对.pro不熟悉,导出以后一通配置,就是不能在QT Creator中编译通过。 所以换了一种方式来实现 1.环境变量设置 PATH添加 qmake.exe的位置 C:\Qt\Qt5.11.2\5.11.2\msvc2017_64\bin PATH添加 64位cl.exe的位置 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\Hostx64\x64\ 2.进入工程目录 带有.pro的文件夹下 打开CMD执行 qmake.exe -tp vc D:\QT\qttest\qttest.pro qmake.exe -t vcapp D:\QT\qttest\qttest.pro qmake.exe -r -tp vc D:\QT\qttest\qttest.pro 生成vcxproj 上面几个命令都试了下,没看出啥差别。 3.然后这个工程就可以同时在VS2017 和 QT Creator 中编译了。 ==================

QT串口通信编程

和自甴很熟 提交于 2020-11-30 06:36:01
#QT串口编程 ##文件夹目录结构如下图所示 ##设计的示例界面如下图所示 ##首先在项目文件里面添加一句 QT += serialport ###SerialPortDemo.pro文件如下: #------------------------------------------------- # # Project created by QtCreator 2019-02-21T13:23:59 # #------------------------------------------------- QT += core gui QT += serialport greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = SerialPortDemo TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated

Qt Creator删除toolbar中多余的“分隔符”

送分小仙女□ 提交于 2020-10-31 19:03:36
Q t Creator 删除toolbar中 多余 的 “ 分隔符 ” 问题描述 在使用Qt Creator开发的时候,添加toolbar的过程中,不小心多添加了3个“分隔符”,在界面中无论是使用“del”键,还是右键都不能删除这些“分隔符”,百度了一下,也没有好用的方法,最后利用如下方法成功解决。 解决方法 1、在工程中找到窗口对应的“.ui”文件,使用文本编辑器打开。 2、找到toolbar选项对应的内容,并找到“分隔符”标签,例如“<addaction name="separator"/>”代表一个分隔符,如下图所示。 3、删除多余的“分隔符”标签,并保存该窗口对应的“.ui”文件,这时在Qt Creator中打开窗体文件后,发现“分隔符”已经被删除了。 如下为“.ui”文件的部分内容 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 </attribute> <addaction name="action_Open"/> <addaction name="separator"/> <addaction name="action_Save"/> <addaction name="separator"/> <addaction name="action_SaveAs"/> <addaction name="separator"/> <addaction name

QT信号与槽(自定义带参数的信号)

走远了吗. 提交于 2020-10-25 04:56:10
关于QT信号与槽的问题其实每个初学QT的人都会遇到,当时我需要做一个带界面的demo,在信号和槽的问题上,我需要的想法是让槽可以有参数的进行操作,但是系统内置的clicked()信号是不含参数的,这对当时根本没接触过QT的我来说就很没头绪,无奈之下只好选择了使用全局变量这个下下策,还好我的demo代码量呀不是很大。我当时是借了一本QT CREATOR快速入门,虽说是好书,但是也很难静得下心来看,于是选择在网上翻阅资料将信号与槽这一部分内容给初步整理了下,得出自己的见解。 QT的作用是做出一个可视化的交互见面,这一点跟中学学的VB很像,当然两者的能力就天差地别了。在QT中,通过控件来实现需求。这里我用最简单的按钮QPushButton和输入框QLineEdit作演示,希望这篇博客能让你对信号和槽有个印象。 为了尽量简洁的说明信号问题,在创建QT项目时选择基类为Widget,不勾选界面。 首先,在QT帮助文档里是有内置的SIGNAL和SLOT的,在SIGNAL中有一个clicked信号,默认参数bool。这里我们需要新建一个按钮,同时定义一个槽函数(槽函数即接收到信号时所做出的行为)。 QPushButton *b2=new QPushButton(this); b2->move(50,50); b2->setText("Send Signal"); edit=new

QT移植:银河麒麟(Kylin)完整移植Qt5.9.2, 包含QCharts和QML等全部模块

China☆狼群 提交于 2020-10-18 12:41:33
最近项目接触到国产飞腾服务器,搭载的是我们国家自主的银河麒麟操作系统,系统自带Qt5.6,只有widget那套框架,没有QML也没有QCharts,因此尝试重新编译一个较新和稳定的Qt版本,所以选择了Qt5.9. 在此记录一下, 以便将来再用。Qt源码内的README文档已经把编译安装步骤写得很详细,出了问题第一时间对照文档是否有遗漏或疏忽。 一、 准备工作 1、官网下载Qt源码,Qt Creator源码。 http://download.qt.io/archive/qt/5.9/5.9.2/single/ http://download.qt.io/official_releases/qtcreator/4.5/4.5.0/ 2、官网下载zlib库 http://www.zlib.net/ 3、确保系统的gcc,g++, python, perl等符合Qt安装要求,具体请参见Qt源码内的README文档 二、编译安装Qt 1、将下载的文件放到/home/kylin/Qt_Source文件夹内 2、解压zlib源码, 进入源码目录,执行以下代码安装。如果系统已经有zlib库, 可以不用执行此步骤 ./configure make & make install 3、解压qt-everywhere-opensource-src-5.9.2源码包,进入解压后的文件夹, 执行.

qt creator源码全方面分析(4-4)

旧街凉风 提交于 2020-10-14 04:50:13
目录 统计接口实现 统计接口实现 我们知道,插件架构必不可少的是定义接口类,即抽象基类,描述用户需要自定义实现的内容。此外,一般还有一个管理器类,对接口类的所有实现类进行管理,并调用其中的接口进行。源码中有两种方式来获取所有实现类。 // 接口类声明 xx.h class ISimple { ISimple(); ~ISimple(); virtual void algo1() = 0; }; // 管理类声明 xxmanager.h class SimpleManager { static void registerSimple(const ISimple *obj); } // xxmanager.cpp实现文件中 // 统计接口的所有实现 static QList<ISimple *> g_simples; // 方式1 ISimple::ISimple() { g_simples.append(this); } ISimple::~ISimple() { g_simples.removeOne(this); } // 方式2 void SimpleManager::registerSimple(const ISimple *obj) { g_simples.append(obj); } 一般,我们会把所有实现的列表g_simples,放在管理类中用于管理。

qt creator源码全方面分析(4-4)

人盡茶涼 提交于 2020-10-04 10:25:57
目录 统计接口实现 统计接口实现 我们知道,插件架构必不可少的是定义接口类,即抽象基类,描述用户需要自定义实现的内容。此外,一般还有一个管理器类,对接口类的所有实现类进行管理,并调用其中的接口进行。源码中有两种方式来获取所有实现类。 // 接口类声明 xx.h class ISimple { ISimple(); ~ISimple(); virtual void algo1() = 0; }; // 管理类声明 xxmanager.h class SimpleManager { static void registerSimple(const ISimple *obj); } // xxmanager.cpp实现文件中 // 统计接口的所有实现 static QList<ISimple *> g_simples; // 方式1 ISimple::ISimple() { g_simples.append(this); } ISimple::~ISimple() { g_simples.removeOne(this); } // 方式2 void SimpleManager::registerSimple(const ISimple *obj) { g_simples.append(obj); } 一般,我们会把所有实现的列表g_simples,放在管理类中用于管理。

Qt三方库开发技术:QXlsx介绍、编译和使用

一个人想着一个人 提交于 2020-09-24 08:30:10
若该文为原创文章,未经允许不得转载 原博主博客地址: https://blog.csdn.net/qq21497936 原博主博客导航: https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址: https://blog.csdn.net/qq21497936/article/details/108292147 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) Qt开发专栏:开发技术(点击传送门) <br> 前话   使用Qt操作Xlsx表格,不依赖office以及wps组件。   本篇文章介绍的方法是使用编译成库的形式以模块加入到源代码中,不使用传统方式编译为模块需要手动添加到Qt安装文件当中去( 无需作为Qt的module加入到安装文件中,笔者提倡模块化,超低耦合 )。 <br> QXlsx介绍   QXlsx是一个可以读写Excel文件的库。它不需要Microsoft Excel,可以在Qt5支持的任何平台上使用。   库支持的功能: 创新新的xlsx文件; 从.xlsx文件中提取数据 编辑现有的

Qt窗体布局思路

感情迁移 提交于 2020-08-17 14:49:47
1.在qtcreator中的设计栏中,有各种layout类型和栅格类型,当选中控件范 围后,控件会自动按相应类型排列,当调整秩序时, 只需在布局->打破布局即可,选中什么layout或grid就打破什么相应范围的布局,再重新拖动控件选定范围内的控件在菜单栏中选定布局类型即可。(如果手动往layout或grid里拖拽控件很难布局想要的效果,所以建议选中控件范围在菜单栏里选定layout设置)。 2.当选定本窗体即本界面最顶级控件的时候,选定菜单栏中的gridlayout,即可实现此界面的所有控件占满全窗体的功能。 来源: oschina 链接: https://my.oschina.net/u/4274621/blog/4500029