Qt 串口插拔提示

Qt 串口拔出提示

一、说明

在日常的工作中,项目中,我们经常遇到使用串口的通讯的场景,这时候我们可能会对串口的插拔进行提示。

Qt的主要实现就是继承自QAbstractNativeEventFilter类,对此类中的nativeEventFilter函数进行重写,完成的。

二、实现

#include 
#include 

bool MainWindow::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
    MSG* msg = reinterpret_cast(message);
    int msgType = msg->message;
    if (msgType == WM_DEVICECHANGE) {
        PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
        switch (msg->wParam)
        {
        case DBT_DEVICEREMOVECOMPLETE:
            if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT)
            {
                PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)lpdb;
                QString port = QString::fromWCharArray(lpdbv->dbcp_name);//拔出的串口名

                if( port == ui->com_num_comboBox->currentText() )
                {
                    QMessageBox::information(this, QStringLiteral("警告"),\
                                         QStringLiteral("串口")+port+QStringLiteral("已移除!"), QMessageBox::Cancel);
                    ui->com_open_Btn->setText(QStringLiteral("打开"));
                    m_bSerialOpenFlag = false;

                    QStringList vctPortName;
                    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
                    {
                        vctPortName << info.portName();
                    }
                    ui->com_num_comboBox->clear();
                    ui->com_num_comboBox->addItems(vctPortName);
                }
            }
            break;
        case DBT_DEVICEARRIVAL:
			if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT) {
				PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)lpdb;
				QString port = QString::fromWCharArray(lpdbv->dbcp_name);//插入的串口名
				QMessageBox::information(this, QStringLiteral("提示"),\
                                         QStringLiteral("串口")+port+QStringLiteral("已连 
                                         接 !"), QMessageBox::Cancel);
			}
			break;
        case DBT_DEVNODES_CHANGED:
            break;
        default:
            break;
        }
    }
    return QWidget::nativeEvent(eventType, message, result);
}

同时,在main函数创建这个继承自QMainwindow的窗口类要注册过滤本地事件的类。

MainWindow w;
w.installNativeEventFilter(&w);
w.show();

本文原创作者:冯一川([email protected]),未经作者授权同意,请勿转载。

你可能感兴趣的:(Qt学习之路,qt,ui,开发语言)