Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Ascet от Март 25, 2015, 05:47



Название: QSetting чтение из реестра
Отправлено: Ascet от Март 25, 2015, 05:47
Здравствуйте, возникла проблема - требуется получить список COM-портов имеющихся у машины.
Пытаюсь прочитать из реестра в Windows с помощью QSetting следующим образом:
Код:
     QSettings settings("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM", QSettings::NativeFormat);
    QStringList keyList = settings.allKeys();
    QStringList valList;
    for(int i = 0; i < keyList.size(); i++)
    {
        valList.append(settings.value(keyList.at(i)).toString());
    }

В keyList правильные значения проверял. Ключи читаются отлично, но в valList - пусто. Проверка ключей с помощью settings->contains(keyList(i)) возвращает всегда false. Как так может быть? Ведь я только что эти ключи от него(settings) получил и тут же спрашиваю его есть ли такой ключ, а он мне говорит что нету.

Что я делаю не так?


Название: Re: QSetting чтение из реестра
Отправлено: gil9red от Март 25, 2015, 07:11
Проверил у себя, и вправду не находит, хотя в реестре значение есть, странно...

Код
C++ (Qt)
   QSettings settings("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM", QSettings::NativeFormat);
 
   foreach (QString key, settings.allKeys()) {
       qDebug() << key << ": " << settings.value(key);
   }
 

Цитировать
Запускается C:\foo\foo\build-untitled-Desktop_Qt_5_3_MinGW_32bit-Debug\debug\untitled.exe...
"/Device/Serial0" :  QVariant(Invalid)
C:\foo\foo\build-untitled-Desktop_Qt_5_3_MinGW_32bit-Debug\debug\untitled.exe завершился с кодом 0


Название: Re: QSetting чтение из реестра
Отправлено: qate от Март 25, 2015, 08:49
и так на 32 бита и на 64 бита ?

в любом случаи дай возможность пользователю вводить имя порта вручную, а не только ограниченный список


Название: Re: QSetting чтение из реестра
Отправлено: Ascet от Март 25, 2015, 08:59
Задание, которое передо мной стоит - автоматический поиск устройства, подключенного к какому-то из портов.
По заведомо мной прописанному списку программа пробегается и работает, но это лишь временное решение, а по идее должен быть поиск имеющихся портов и опрос по ним если они доступны.


Название: Re: QSetting чтение из реестра
Отправлено: GraninDm от Март 25, 2015, 09:23
Вы же все равно будете с портами работать.
Может быть использовать для этого QSerialPort и QSerialPortInfo.


Название: Re: QSetting чтение из реестра
Отправлено: Ascet от Март 25, 2015, 11:10
Ну тут к сожалению имеет место проблема с целевой системой. Там Qt будет не новее 4.8.3, а возможности доставлять библиотечки не будет к сожалению=(
Сам жалею, что нет такой возможности ибо через QSerialPort всё решается довольно просто=(


Название: Re: QSetting чтение из реестра
Отправлено: kuzulis от Март 25, 2015, 11:25
Цитировать
Там Qt будет не новее 4.8.3, а возможности доставлять библиотечки не будет к сожалению

1. QtSerialPort работает и с Qt 4.8.x.
2. QSettings не работает с такими путями реестра.




Название: Re: QSetting чтение из реестра
Отправлено: Ascet от Март 25, 2015, 11:37
в 4.8 QSerialPort нет, он доставляется поверх, чего я сделать не могу.
А не можете подсказать почему не работает этими путями и где можно прочитать про это?


Название: Re: QSetting чтение из реестра
Отправлено: Пантер от Март 25, 2015, 11:41
в 4.8 QSerialPort нет, он доставляется поверх, чего я сделать не могу.
А что тебе мешает включить его в свой проект в 3rdparty?


Название: Re: QSetting чтение из реестра
Отправлено: qate от Март 25, 2015, 12:56
Ну тут к сожалению имеет место проблема с целевой системой. Там Qt будет не новее 4.8.3, а возможности доставлять библиотечки не будет к сожалению=(

qt5 библиотеки можно и рядом положить - это тоже запрещено по условиям задачи ?


Название: Re: QSetting чтение из реестра
Отправлено: Ascet от Март 25, 2015, 13:35
Ну кстати да, с собой тащить эти библиотеки...
Сейчас рабочий день уже подходит к концу, завтра попробую провернуть такой вариант.
спасибо)

Но с реестром всё равно хотелось бы разобраться почему он не может получить эти значения?


Название: Re: QSetting чтение из реестра
Отправлено: GraninDm от Март 25, 2015, 13:57
Наверное потому, что это класс для работы с настройками приложения а не ОС.
Ибо реестр не кроссплатформенная штука.


Название: Re: QSetting чтение из реестра
Отправлено: kuzulis от Март 25, 2015, 14:11
Цитата: Ascet
Но с реестром всё равно хотелось бы разобраться почему он не может получить эти значения?

Потому что он не может "распарсить" ключи вида:

Цитировать
\Device\Serial0
\Device\com0com10

и прочие, т.к. у них обратный слеш (такой вот QSettings), тут нужно использовать WinAPI, ЕМНИП.

PS: Можешь (ради эксперимента) создать там в реестре нормальные ключи без '\' и увидишь, что оно тогда вернет все что надо.


Название: Re: QSetting чтение из реестра
Отправлено: Fregloin от Март 25, 2015, 22:34
а пройтись по всем компортам вручную, просто каждый раз создавая и открывая устройство COM%1 от 1...MAX, где MAX максимальное колво устройств в системе. Запомнить удачно открытые устройства и дальше работать только с ними. Если изменилась конфигурация, нажать на кнопку "Найти" и опять прогнать цикл открытия ком-портов. Я бы так сделал. При чем можно в несколько потоков открывать для ускорения сканирования.


Название: Re: QSetting чтение из реестра
Отправлено: Bepec от Март 26, 2015, 02:30
Winapi в помощь, дело десяти минут, готовых примеров полно.


Название: Re: QSetting чтение из реестра
Отправлено: Ascet от Март 26, 2015, 05:16
Цитировать
а пройтись по всем компортам вручную, просто каждый раз создавая и открывая устройство COM%1 от 1...MAX, где MAX максимальное колво устройств в системе. Запомнить удачно открытые устройства и дальше работать только с ними. Если изменилась конфигурация, нажать на кнопку "Найти" и опять прогнать цикл открытия ком-портов. Я бы так сделал. При чем можно в несколько потоков открывать для ускорения сканирования.

У меня так сделано сейчас и я хочу от этого отойти, получая реально имеющиеся порты.

А вот с WinAPI разобраться нахрапом не смог ибо программист я начинающий, а те коды, которые в инете находил не заводились. Если вам не сложно можете скинуть работающий пример?


Название: Re: QSetting чтение из реестра
Отправлено: GraninDm от Март 26, 2015, 08:33
Так посмотрите qserialportinfo_win.cpp

static QStringList portNamesFromHardwareDeviceMap()
...