因为工作中挺多项目用到串口连接,所以每次实现获取串口号觉得挺麻烦的,所以自己封装了这样一个CustomComboBox类。先上代码:
//customcombobox.h
#ifndef CUSTOMCOMBOBOX_H
#define CUSTOMCOMBOBOX_H
#include <QComboBox>
#include <QtSerialPort/QSerialPortInfo>
#include <QtSerialPort/QSerialPort>
class CustomComboBox : public QComboBox
{
Q_OBJECT
public:
explicit CustomComboBox(QWidget *parent = nullptr,bool askoccupy=0);
~CustomComboBox()override;
void showPopup()override;
void setAskOccupy(const bool &flag);
private:
bool mAskOccupy;
};
#endif // CUSTOMCOMBOBOX_H
//customcombobox.cpp
#include "customcombobox.h"
/**
* @projectName CustomComboBox
* @author darkcell-yao
* @datetime 2019-12-27 周五 15:38:03:264
* @brief 用于串口号遍历查询
* @other 使用时如果参数askoccupy为true则确认是否该串口被占用,被占用则不添加
* 如果参数askoccupy为false则添加所有存在串口,此标志默认false,可以用
* setAskOccupy修改
*/
CustomComboBox::CustomComboBox(QWidget *parent,bool askoccupy) :
QComboBox(parent),mAskOccupy(askoccupy)
{
}
CustomComboBox::~CustomComboBox()
{
}
void CustomComboBox::showPopup()
{
QString current_text = this->currentText();
QStringList namelist;
namelist.clear();
QComboBox::clear();
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(mAskOccupy){
if(serial.open(QIODevice::ReadWrite)) //遍历可打开串口
{
namelist.append(serial.portName());
serial.close();
}
else{
if(serial.portName()==current_text){ //当前串口如果打开也要添加
namelist.append(serial.portName());
}
}
}
else{ //遍历添加所有串口
namelist.append(serial.portName());
}
}
QComboBox::addItems(namelist);
setCurrentText(current_text);
QComboBox::showPopup();
}
void CustomComboBox::setAskOccupy(const bool &flag)
{
mAskOccupy = flag;
}
创建窗体项目的时候只能选择QMainWindow、QWidget、QDialog三种基类,而我们需要继承的是QComboBox,所以直接选择QWidget类。然后再将QWidget改为QComboBox。
在这里我们的构造函数中除了parent参数外还有一个askoccupy参数,主要用来查询串口是否判断串口可用。
另外就是重载了showPopup函数,这个函数就是用来显示下拉列表的。
在showPopup函数实现中,使用QSerialPortInfo::availablePorts()函数获取所有可获得的串口信息,并遍历。将每一个QSerialPortInfo通过QSerialPort的setPort函数设置,从而获取串口号。在这里会根据构造函数设置的askOccupy属性进行区别是否判断串口的可用性。
最后就是将所有查询到的串口号添加到类的item中,并调用showPopup()显示。