用Qt获取系统可用的串口信息


可编译运行

问题:使用QSettings时,对于注册表中类似于串口信息中的\Device\Serial0的这种key值,用value()函数无法读到其value。

分析:QT在读取注册表时,对于有路径分隔符“\”“/”的value都无法读取,应该属于QT的一个小bug。

解决方法:

.h文件

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QMessageBox>

#include <qt_windows.h>

#include <QSettings>

#include <QtGui/QMainWindow>

namespace Ui {

    class Widget;

}

class Widget : public QWidget

{

    Q_OBJECT

public:

    explicit Widget(QWidget *parent = 0);

    ~Widget();

private:

    Ui::Widget *ui;

    QStringList m_listcomboName;

    HKEY hKey;

    LPCWSTR subkey;

    wchar_t keyname[256]; //键名数组

    char keyvalue[256];  //键值数组

    DWORD keysize,type,valuesize;

    int indexnum;

public:

    QString getcomm(int index,QString keyorvalue); //读取键名

};

#endif // WIDGET_H

 

.cpp 文件

#include"widget.h"
#include"ui_widget.h"
Widget::Widget(QWidget*parent):
    QWidget(parent),
    ui(newUi::Widget)
{
    ui->setupUi(this);
    QStringpath="HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
    QSettings*settings=newQSettings(path,QSettings::NativeFormat);
    QStringListkey=settings->allKeys();
    intnum=(int)key.size();
    QStringvalue;
    for(inti=0;i<num;i++)
    {
        value=getcomm(i,"value");
        m_listcomboName<<value;
    }
 
 
}
Widget::~Widget()
{
    deleteui;
}
QStringWidget::getcomm(intindex,QStringkeyorvalue)
//index为索引号,keyorvalue为选择返回值应该为key还是value
{
    QStringcommresult;
    if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),0,KEY_READ,&hKey)!=0)
    {
        QStringerror="Cannotopenregedit!";//无法打开注册表时返回error
        returnerror;
    }//if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0)
    QStringkeymessage;//键名
    QStringmessage;
    QStringvaluemessage;//键值
    indexnum=index;//要读取键值的索引号
    keysize=sizeof(keyname);
    valuesize=sizeof(keyvalue);
    if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0)//列举键名和值
    {
        for(inti=0;i<keysize;i++)
        {
            message=keyname[i];
            keymessage.append(message);
        }//for(inti=0;i<=keysize;i++)    读取键名
        for(intj=0;j<valuesize;j++)
        {
             if(keyvalue[j]!=0x00)
             {
                 valuemessage.append(keyvalue[j]);
             }
        }//for(intj=0;j<valuesize;j++)读取键值
        if(keyorvalue=="key")
        {
             commresult=keymessage;
        }
        if(keyorvalue=="value")
        {
             commresult=valuemessage;
        }
    }
    else
    {
         commresult="nokey";
    }//if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0)列举键名和值
    returncommresult;
    ::RegCloseKey(hKey);//关闭注册表
}

 

 

以下是参考链接

http://wenku.baidu.com/link?url=hEXrD6-7wOf2SLoN2Diw_4h5fDgsrfonSB_d4mCOyuUvvGBm5W45vxbJYBGc21OK7pJReuMuJLy6_ZzSNpoNU6MFuWEDY_RINPPZW8MTc53

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值