layout: post
title: Qt VideoMeeting_Intercom师生对讲开发中实际上遇到的一些问题,终于结项了,也照例写一下总结吧。
description: 软件开发,初次开发的一次总结
categories: 实例
keywords: 教程,Qt,素材,实例

总结一下开发中遇到的问题:

1.一个方法:关于在建立程序之初,用一个类的静态对象来控制整个程序。

本来我想的是,建立一个名字叫MyApplication的类来继承QApplication()类,并以此作为整个程序的主进程来操作,但是这样操作很麻烦,当然,这样显然是可以的。但有个问题,就是继承QApplication类需要传入两个参数,这两个参数我们并不知道有什么用,而且我们声明全局变量的时候,能不能直接就向其中传入(0,null)这样的参数呢?这个MyApplication会不会因此为空呢?这些我在实际操作中试验过,但结果是什么我已经忘得差不多了,之后可能会单独写demo实验一下。

还有种另外的方法就是:写一个类,然后用一个声明/获取 静态对象一体的方法,来做一个全局的控制。怎么实现呢?举个例子:

我们可以声明一个普通的类tApp,

注意你这是在qt内来用的,所以这个类应该继承QObject

class tApp : public QObject
{
Q_OBJECT public:
tApp();
~tApp();

然后我们可以声明一个方法

  static tApp& tApp::theApp();

这个方法的定义如下

tApp & tApp::theApp()
{
static tApp theApp;
return theApp;
// TODO: 在此处插入 return 语句
}

如果当前没有这么个theApp的静态对象时,则初始化声明这么个theApp类,如果当前这个theApp静态对象已经被声明了,那么可以通过theApp()方法调用这个静态对象,如果我们想要connect 这个指针呢?那就可以直接在前面加个&符号来取这个地址。

然后呢?我们可以把所有的窗体控制、网络控制、关键数据、输入、输出塞到这个tApp类中,而不是塞到某个特定的窗体中进行,然后通过connect,将窗体、网络、数据之间的信号连接,这样就可以避免了一些兄弟窗体之间通信的问题。

2.QJson字符串,因为开始不知道这个是什么东西,所以这个也折磨了我很久。

关于QJson相关的内容,详情可以见这个连接QJson的生成和解析,这个实例写的蛮好的,之后我也会陆续上传一些demo实例来作为例子,这里举例如下:QJsonDemo

3.界面之间,如果是自己的软件内的,可以直接传一整个结构,不用一个值一个值单独传

这是我踩过最严重的坑,没有之一。

讲下开发的时候发生了什么:在做这个程序的时候,我还没有先做进程类,或者静态类来处理整个界面的想法,而是直接进来就直接到页面了,然后所有的控制处理,和信号传递,都通过这个页面来进行。但开发到后面才发现,原来这个页面前面还有另外的一个页面,但由于前面这个页面的存在,整个软件的操作和信号传递都变得极其不方便。

这还不是最主要的,最主要的是--在我不知道json字符串的时候,两个界面之间传递数据还是通过正则进行,这就很坑爹了。

如果是通过json,那么两个窗体之间又需要单独地进行一些打包和解析,这不进为后续的开发造成了隐患,还会让整个程序变得无法维护。

所以界面之间,如果可以的话,直接传递数据结构是最好的,而不是从上到下传递一个打包好的字符串,这个也是需要在开发中 着重明确的,需要在进程类就将所有的成员信息打包,然后不管是组件也好,变量也好,一个成员就对应一个特定的结构,这样是最好的,既能保证整个程序的可拓展性,又能保证整个程序的可维护性和可读性。

4.TCP连接的时候,建立服务器还是客户端进行连接,都不要开vpn,网络可能会被变化,这点要注意。

这个是网络问题,没什么好说的。

之后还发生过一次教师端和学生端之间没法连接的问题,重新编译了一下教师端的netmessage.dll才解决的,具体问题原因不详。

5.做软件的时候,如果有视频,或者有什么单独需要控制的类,可以把 控制单独放在一个蒙版里进行操作,这样就既可以避免一些bug,也可以把模块间的功能划分的清晰一点,这样可以让整个软件的结构更加清晰。

之前是整个软件中控制和 视频放在同一个窗体里进行的,但是这样做不仅效率不高,而且蒙版还极有可能会把视频给挡住(即使蒙版本身是透明的,但是对于非qt的模块来说,没有WA_Translate这个属性的设置依然是完整的窗体,会盖住并停止渲染),所以有时候我们可以做一个单独的窗口来对所有的按钮和操作来进行控制,视频的窗体就安安心心地控制着视频就好了

控制界面蒙版窗体:

视频界面:

但要注意的是:控制界面,或者说蒙版界面应该是视频界面的子窗体(子窗体会永远悬浮在父窗体之上),所以实际上只是蒙版界面在发送一些信号出来给视频界面,实际上的内核操作还是在视频界面,或者说为这个单独的模块,还可以另外再写一个静态类出来,不过只看你是否需要。

6.关于动效,如果刷新频率比较高,且图片大小比较大的时候,QSS图片的刷新可能失效

这点我要说明一下,之前是在那个视频的那一栏进行的头像动效的绘制,不知道是 它这个视频的dll的机制问题,还是我这里写的方法有问题,总之头像动效和视频不能放在同一的主窗体下,否则会导致一些意外的卡顿。

当然也有可能是因为我没加上update();这个方法可以强制重新绘制当前widget,每次刷新stylesheet的时候就可以重新绘制当前widget了。

7.为了避免一些重复引用的情况发生,当我们做一些全局的声明时,请单独用一个.h文件保存起来

比如什么呢?

就比如我们常见的,对SendMessage发送消息码,有时候我们会需要定义一些消息码的名称,有时候我们有需要定义一些指定的数据结构struct,或者无边框窗体最常见的enum Direction{}这样的公共定义,最好不要每次都在自己的.h中定义,这样极容易重复,单独定义一个.h文件,然后需要的时候调用就好了,这样不容易重复定义

比如我们声明一个MSG.h文件来命名一些SendMessage中的内容,UserItem.h文件定义数据结构,Define.h来定义enum等等,或者放在一起,由pragma once保护,会比随意放置安全得多。

8.qt中尽量别用指针,没必要用,qt有一套完善的类stl容器和自我垃圾处理机制,不用单独写一个指针来作为存储对象,尽可能地用QList解决问题

QList Thing 这个是真的神,当然必要的时候,比如赋给某些控件的时候,也可以用指针,但是一般声明的时候没必要直接用指针,这个见仁见智,但是在qt内一般情况下都是没必要用

Qt VideoMeeting_Intercom师生对讲开发中实际上遇到的一些问题,终于结项了,也照例写一下总结吧。的更多相关文章

  1. C、C++、boost、Qt在嵌入式系统开发中的使用

    概述 嵌入式系统开发相对来说属于偏底层的开发,也就是与硬件结合比较紧密,只能使用C/C++语言.对于做平台开发的人来说,C语言真的是很"古老"的语言,属于操作系统语言!好多人会觉得 ...

  2. 前端开发中使用mac自带apache服务

    场景 前端开发中,总是会有这样的需求,就是快速的写一个脚本,或者一个简单的demo页面.这时,我们需要马上可以启动一个web服务,来支持开发. 我们可以安装一个全局的cli工具,通过node服务来满足 ...

  3. Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享

    Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑&qu ...

  4. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  5. 关于 WP 开发中.xaml 与.xaml.cs 的关系

    今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...

  6. H5开发中的问题总结

    最近公司做了一个出行日记的项目,里面的页面十多页,天天加班,做到吐血.总体来说,写页面的时候虽然是十多个页面,其实难度还是在每个页面的特效上.公司是易到用车,出行日记的页面在APP里有生成入口,有兴趣 ...

  7. PHP开发中的缓存技术汇总

    在PHP开发中,出于对网站服务器负载的考虑,往往需要对页面.数据等内容进行缓存处理,下面就来看看,在PHP开发中有哪些缓存方式吧. 1.页面部分缓存该种方式,是将一个页面中不经常变的部分进行静态缓存, ...

  8. Viewbox在UWP开发中的应用

    Windows 8.1 与Windows Phone 8.1的UAP应用,终于在Windows 10上统一到了UWP之下.原来3个不同的project也变为一个.没有了2套xaml页面,我们需要用同一 ...

  9. 浅谈Excel开发:十 Excel 开发中与线程相关的若干问题

    采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互 ...

  10. 在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储

    在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如 ...

随机推荐

  1. 史上最全的selenium三大等待介绍

    一.强制等待 1.设置完等待后不管有没有找到元素,都会执行等待,等待结束后才会执行下一步 2.实例 driver = webdriver.Chrome() driver.get("https ...

  2. vue基础之MV*和它们之间的不同

    vue中的设计思想 vue中的设计思想主要是MV*模式,由最早的MVC(model-view-controller)框架,到后面的MVP(model-view-presenter),甚至到最后的MVV ...

  3. win10 python 环境搭建

    1.在官网上下载python安装程序:www.python.org 官网是英文的,程序自己慢慢找就好了.因为机子是64位的,所以必须下载64位的pyhon安装程序,另外我这里下的是python版本是2 ...

  4. 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)

    容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...

  5. 利用Hutool-(Java工具类)实现验证码校验

    目录 Hutool工具类介绍 Hutool实现验证码生成 测试验证码生成 其他样式的验证码 第一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类. ...

  6. iptables使用详解

    iptables使用详解 @(linux)[iptables] 前言 最近买了一个VPS,并在上面搭了DOCKER,然后再DOCKER中安装Mysql.但只要将网络端口映射到宿主机上,那么外部网络就可 ...

  7. LcdTools如何编写MIPI指令(初始化代码)

    在LcdTools帮助文档中查看MIPI读写指令描述,如下图 编写LCM初始化代码就是配置LCM Driver IC寄存器值,一般只需用MipiWrite()指令写参数即可:下面介绍MipiWrite ...

  8. .Net 文件导出下载

    //1.首先要有文件路径 2.要知道文件扩展名 3.根据扩展名在Provider Map对应的contentType 4.return FileSteam public IActionResult E ...

  9. HTML躬行记(3)——WebRTC视频通话

    WebRTC 在创建点对点(P2P)的连接之前,会先通过信令服务器交换两端的 SDP 和 ICE Candidate,取两者的交集,决定最终的音视频参数.传输协议.NAT 打洞方式等信息. 在完成媒体 ...

  10. ES6 学习笔记(十)Map的基本用法

    1 基本用法 Map类型是键值对的有序列表,而键和值都可以是任意类型.可以看做Python中的字典(Dictionary)类型. 1.1 创建方法 Map本身是一个构造函数,用来生成Map实例,如: ...