컴파일 및 실행 가능
문제 : QSettings를 사용할 때 직렬 포트 정보 의 \Device\Serial0 과 유사한 레지스트리 의 키 값에 대해 value() 함수 로 해당 값을 읽을 수 없습니다 .
분석: QT가 레지스트리를 읽을 때 경로 구분자 " \ " 및 " / " 가 있는 값을 읽을 수 없습니다 . 이는 QT 의 작은 버그 입니다 .
해결책:
.h 파일
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMessageBox>
#include <qt_windows.h>
#include <Q설정>
#include <QtGui/QMainWindow>
네임스페이스 Ui {
클래스 위젯 ;
}
클래스 위젯 : 공개 QWidget
{
Q_OBJECT
공개 :
명시적 위젯 ( QWidget * 부모 = 0 );
~ 위젯 ();
비공개 :
Ui :: Widget * ui ;
QStringList m_listcomboName ;
HKEY h키 ;
LPCWSTR 하위 키 ;
wchar_t keyname [ 256 ]; // 키 이름 배열
char keyvalue [ 256 ]; // 키 값 배열
DWORD 키 크기 , 유형 , 값 크기 ;
int 색인 번호 ;
공개 :
QString getcomm ( int index , QString keyorvalue ); // 키 이름 읽기
};
#endif // WIDGET_H
.cpp 파일
#include "widget.h"
#include "ui_widget.h"
위젯 :: 위젯 ( QWidget *부모) :
QWidget (상위),
ui ( 새로운 Ui :: 위젯 )
{
쿼리 -> setupQuery ( this );
QString 경로 = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\" ;
QSettings *settings = 새 QSettings ( 경로, QSettings :: NativeFormat );
QStringList 키 = 설정-> allKeys ();
정수 번호 = ( 정수 )키. 크기 ();
QString 값;
for ( int i= 0 ; i<숫자; i++)
{
value = getcomm(i, "value");
m_listcomboName<<value;
}
}
Widget::~Widget()
{
delete ui;
}
QString Widget::getcomm(int index,QString keyorvalue)
//index为索引号,keyorvalue为选择返回值应该为key还是value
{
QString commresult;
if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),0,KEY_READ,&hKey)!=0)
{
QString error="Cannot open regedit!";//无法打开注册表时返回error
return error;
}//if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0)
QString keymessage;//键名
QString message;
QString valuemessage;//键值
indexnum = index;//要读取键值的索引号
keysize=sizeof(keyname);
valuesize=sizeof(keyvalue);
if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0)//列举键名和值
{
for(int i=0;i<keysize;i++)
{
message=keyname[i];
keymessage.append(message);
}// for(int i=0;i<=keysize;i++) 读取键名
for(int j=0;j<valuesize;j++)
{
if(keyvalue[j]!=0x00)
{
valuemessage.append(keyvalue[j]);
}
}//for(int j=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) 列举键名和值
return commresult;
::RegCloseKey(hKey);//关闭注册表
}
以下是参考链接