QT 自动获取可用串口
- MainWindow.h头文件中添加依赖的头文件
#include <QSettings>
#include <qt_windows.h>
2.类MainWindow中定义变量,声明函数
public:
//定义变量
HKEY hKey;
LPCWSTR subkey;
wchar_t keyname[256]; //键名数组
char keyvalue[256]; //键值数组
DWORD keysize,type,valuesize;
int indexnum;
//声明函数
QString getcomm(int index, QString keyorvalue);
void init_comm();
- MainWindow.cpp源文件中实现
QString MainWindow::getcomm(int index, QString keyorvalue)
{
QString commResult;//返回
QString keyMessage;
QString valueMessage;
QString message;
//打开注册表
if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hKey) != 0)
{
qDebug("Cannot open reg!");
return "Error";
}
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<(int)keysize; i++)
{
message = keyname[i];
keyMessage.append(message);
}
for (int j = 0; j < (int)valuesize; j++)
{
if (keyvalue[j] != 0x00)
{
valueMessage.append(keyvalue[j]);
}
}
if (keyorvalue == "key")
{
commResult = keyMessage;
}
if (keyorvalue == "value")
{
commResult = valueMessage;
}
}
else
{
commResult = "nokey";
}
RegCloseKey(hKey);//关闭注册表
return commResult;
}
void MainWindow::init_comm()
{
QString path = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM";
QSettings *settings = new QSettings(path, QSettings::NativeFormat);
QStringList keylist = settings->allKeys();
QStringList comlist;
comlist.clear();
/* 获取串口名 */
for (int i = 0; i < keylist.size(); i++)
{
if(getcomm(i, "value") != "Error" && getcomm(i, "value") != "nokey")
{
comlist << getcomm(i, "value");
}
}
ui->portNameComboBox->addItems(comlist);
}
4.在构造函数中进行调用init_comm()即可。