2017-11-12 3 views
-1

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:

enter image description here

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:

enter image description here

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.

Antwort

0

Da QTreeWidget nicht prüft, ob ein Duplikat eingefügt wurde, müssen Sie einen zusätzlichen Container verwenden, der den Ausschluss von Duplikaten wie QMap oder QHash unterstützt.

Bevor Sie die Elemente in Ihr Baum-Widget einfügen, überprüfen Sie, ob die SSID nicht bereits (als Schlüssel) in Ihrer map/Hash-Tabelle vorhanden ist. Wenn die Überprüfung anzeigt, dass eine solche SSID vorhanden ist, fügen Sie sie einfach nicht ein.

+0

Ok. Ich werde es versuchen und antworten. Vielen Dank. – Cobra91151

+0

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

+0

"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