自定义ComboBox——获取串口号

因为工作中挺多项目用到串口连接,所以每次实现获取串口号觉得挺麻烦的,所以自己封装了这样一个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()显示。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值