一,前言
最近在思考做些什么小工具练手,想到了一个上下位机控制系统。
二,设计
简单来说就是上位机是个开关,通过串口通信传递开关命令到下位机。要复用之前的串口代码基于QT的MCV架构重构--Apple的学习笔记,主要目的也是看看自己之前写的代码是否在可移植性及可扩展性上比较好。
三,遇到的问题
1. widget中如何添加菜单栏和状态栏?
答:方法是layout中setMenuBar可以添加菜单栏,状态栏通过layout中addwidget添加QStatusBar控件。
2.QComboBox的下拉菜单选项相同是无法触发信号?
答:currentIndexChanged是选择不同时候触发。若选项相同也要触发,需要使用activated。
3.如何获取QComboBoxd的自定义信息?
答:m_comPortlist->currentData().toInt()。若定义的是int类型。我的初始化函数如下。
/* 设置下拉菜单 */
QMap<QString, int> comChannel;
comChannel.insert("",0);
comChannel.insert("com3",3);
comChannel.insert("com4",4);
comChannel.insert("com5",5);
comChannel.insert("com6",6);
m_comPortlist->clear();
foreach(const QString &str,comChannel.keys())
m_comPortlist->addItem(str,comChannel.value(str));
connect(m_comPortlist,&QComboBox::activated,this,&Settings::InitPort);
4.串口通道连接正常后,切换为非法通道,再切换为可用通道则无法连接?
答:先要关闭,才能重新初始化。
void Settings::InitPort()
{
if(!m_PortInitNo)
{
mycontroller::GetInstance()->openCom();
}
else
{
if(m_PortInitNo != m_comPortlist->currentData().toInt())
{
mycontroller::GetInstance()->closeCom();//关闭之前的通道
mycontroller::GetInstance()->openCom();//开启新的通道
}
}
}
四,效果
先控制了stm32单片机,然后接了一个继电器来控制LED。本次的另外一个目的就是试用下5V继电器模块,哈哈~
relay.jpg
image.png
light.gif
五,小结
感觉之前的串口类设计的不太好,改动量比我预期的大,主要是本次传输协议不同了。不用的应用场景期望用同一套代码复用,这还是需要考验下抽象设计能力的。
网友评论