я хочу удалить 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
(с профилями). Проблема была исправлена.
поскольку QTreeWidget
не проверяет, вставлен ли дубликат, вам нужно использовать дополнительный контейнер, который поддерживает исключение дубликатов, таких как QMap
или же QHash
,
Перед тем, как вставлять элементы в виджет дерева, проверьте, не присутствует ли SSID (как ключ) в вашей карте / хэш-таблице. Если проверка говорит, что такой SSID существует, просто не вставляйте его.
Других решений пока нет …