Ich möchte wlan SSID
Duplikate aus QTreeWidget
entfernen oder einige Überprüfung für die Duplikate vor der Anzeige in der QTreeWidget
hinzufügen.SSID entfernen Duplikate Problem
Screenshot:
Ich habe versucht, Duplikate von QSet
entfernen, aber es entfernt auch SSID
, die in der Liste sein sollte, so funktioniert es nicht in meinem Fall.
Beispielcode:
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);
}
der eigentliche Code ist sehr groß und komplex, enthaltenden Strukturen, Vektoren und Vektoriteration Inserts QTreeWidgetItems
zum QTreeWidget
.
Ich habe es überprüft und es entfernt die letzten zwei SSID
's als Duplikate.
Ich möchte das gleiche Verhalten wie in Windows
. Irgendwelche Ideen? Vielen Dank.
Update:
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();
}
Jetzt arbeitet es, aber ich brauche auch andere Funktionen zu beheben.
Update: 2 Schließlich habe ich den Fehler behoben und fügen Sie alle Daten an die QTreeWidget
aber manchmal Profil Spalte unterscheidet sich mit SSID Spalte. Die Sache ist, dass das Profil nicht hinzugefügt wird und stattdessen SSIDs angezeigt wird, wie es in Windows OS
in der Profilspalte ist, andernfalls wird es leer sein.
Screenshot:
So ist der Code:
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");
}
}
}
Auch habe ich verändert die QMap
-QHash
, um es schneller und wirelessAPData
ist nur ein struct
. Vielen Dank.
Update: 3 Ich denke, es sollte eine bessere Lösung, weil diese SSID
ist nicht Duplikate sind, sie haben unterschiedliche Flags
, zum Beispiel einige von ihnen haben (has profile
, no profile
, connected
) Fahnen. Auch habe ich einige Konstanten mit Werten erstellt:
3 - connected
, 2 - has profile
, 0 - no profile
Und wenn ich Netzwerke mit diesen Konstanten Werten überprüfe ich zum Beispiel nur mit no profile
oder has profile
oder connected
.Aber ich brauche etwas zu überprüfen mit has profile
und nur neu mit no profile
. Irgendwelche Ideen? Vielen Dank.
Update: 4: Ich habe die Anwendung neu gestaltet solche APs
(mit Profilen) zu unterstützen. Das Problem wurde behoben.
Ok. Ich werde es versuchen und antworten. Vielen Dank. – Cobra91151
Ich habe Ihren Vorschlag überprüft, aber beim Einfügen in 'QMap' sind die Schlüssel in meinem Fall anders. Also kann ich es nicht vergleichen. Codebeispiel in meinem Hauptpost. – Cobra91151
"die Schlüssel sind in meinem Fall anders"? Aber geht es nicht um das Entfernen von Duplikaten? Also sollte eine SSID zweimal oder noch mehr kommen. Auch bei 'QMap' müssen Sie beim Einfügen vorsichtig sein. Da in der Dokumentation angegeben wird, dass bereits ein Schlüssel vorhanden ist, wird durch das Einfügen eines neuen Elements mit demselben Schlüssel nur das Element ersetzt, das in der Karte gespeichert ist. Daher ist die Verwendung von 'QMap :: contains 'definitiv etwas, das vor dem Aufruf von insert verwendet werden muss. – rbaleksandar