SSID удалить проблему с дубликатами

я хочу удалить wlan SSID дубликаты из QTreeWidget или добавьте некоторую проверку на наличие дубликатов перед отображением в QTreeWidget,

Скриншот:

введите описание изображения здесь

Я попытался удалить дубликаты QSet, но это также удаляет SSID который должен быть в списке, так что это не работает в моем случае.

Образец кода:

  QStringList apList;

for (int i = 0; i < (int)pBssList->dwNumberOfItems; i++) {
pBssEntry = (WLAN_AVAILABLE_NETWORK *)&pBssList->Network[i];
apList << QString::fromUtf8(reinterpret_cast<char *>(pBssEntry->dot11Ssid.ucSSID), pBssEntry->dot11Ssid.uSSIDLength);
}

QSet<QString> apSet = QSet<QString>::fromList(apList);

for (int j = 0; j < apSet.count(); j++) {
pBssEntry = (WLAN_AVAILABLE_NETWORK *)&pBssList->Network[j];
qDebug() << QString::fromUtf8(reinterpret_cast<char *>(pBssEntry->dot11Ssid.ucSSID), pBssEntry->dot11Ssid.uSSIDLength);
}

Фактический код очень большой и сложный, содержащий структуры, векторы и вставки векторной итерации. QTreeWidgetItems к QTreeWidget,

Я проверил это, и он удаляет последние два SSIDкак дубликаты.

Я хочу такое же поведение, как в Windows, Есть идеи? Благодарю.

Обновить:

 QMap<QString, int> apMap;

for (int i = 0; i < (int)pBssList->dwNumberOfItems; i++) {
pBssEntry = (WLAN_AVAILABLE_NETWORK *)&pBssList->Network[i];
apMap.insert(QString::fromUtf8(reinterpret_cast<char *>(pBssEntry->dot11Ssid.ucSSID), pBssEntry->dot11Ssid.uSSIDLength), i);
}

qDebug() << apMap.count();
qDebug() << apMap.uniqueKeys();
QMap<QString, int>::iterator it;

for (it = apMap.begin(); it != apMap.end(); it++) {
qDebug() << it.key();
}

Сейчас это работает, но мне нужно исправить и другие функции.

Обновление: 2
Наконец, я исправил ошибку и добавил все данные в QTreeWidget но иногда столбец профиля отличается от столбца SSID. Дело в том, что профиль не добавляется, и вместо него отображаются SSID, как в Windows OS в столбце профиля в противном случае он будет пустым.

Скриншот:

введите описание изображения здесь

Итак, код:

           for (int j = 0; j < apHash.uniqueKeys().count(); j++) {
pBssEntry = (WLAN_AVAILABLE_NETWORK *)&pBssList->Network[j];
if (wcslen(pBssEntry->strProfileName) != NULL) {
wirelessAPData.profile = QString::fromWCharArray(pBssEntry->strProfileName);
wirelessAPData.name = apHash.uniqueKeys().value(j);
} else {
if (!apHash.uniqueKeys().value(j).isEmpty()) {
wirelessAPData.profile = apHash.uniqueKeys().value(j);
wirelessAPData.name = apHash.uniqueKeys().value(j);
} else {
wirelessAPData.profile = QObject::tr("Hidden network");
wirelessAPData.name = QObject::tr("Hidden network");
}
}
}

Также я изменил QMap в QHash сделать это быстрее и wirelessAPData это просто struct, Благодарю.

Обновление: 3
Я думаю, что должно быть лучшее решение, потому что эти SSIDЭто не дубликаты, они имеют разные FlagsНапример, некоторые из них имеют (has profile, no profile, connected) флаги. Также я создал несколько констант со значениями:

3 - connected,
2 - has profile,
0 - no profile

И когда я проверяю сети с этими значениями констант, я получаю, например, только с no profile или же has profile или же connected, Но мне нужна проверка для отображения с has profile и только новый с no profile, Есть идеи? Благодарю.

Обновление: 4:
Я переработал приложение для поддержки таких APs (с профилями). Проблема была исправлена.

-1

Решение

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

Перед тем, как вставлять элементы в виджет дерева, проверьте, не присутствует ли SSID (как ключ) в вашей карте / хэш-таблице. Если проверка говорит, что такой SSID существует, просто не вставляйте его.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]