2017-11-12 43 views
-1

QTreeWidget에서 wlan SSID 중복을 제거하거나 중복을 확인하고 싶습니다. QTreeWidget에 표시하고 싶습니다.SSID 중복 제거 문제

스크린 샷 :

enter image description here

나는 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); 
} 

실제 코드 구조, 벡터 및 벡터 반복 삽입합니다 QTreeWidgetQTreeWidgetItems을 포함, 매우 크고 복잡하다.

나는 그것을 검사했고 마지막 두 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 열이 다르다. 문제는 프로필이 추가되지 않고 프로필 열에 Windows OS에 표시된 것과 같이 SSID가 표시된다는 것입니다. 그렇지 않으면 SSID가 비어있게됩니다.

스크린 샷 : enter image description here

그래서 코드 :

  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"); 
        } 
       } 
      } 

또한 나는이 QMapQHash에 빠르고 wirelessAPData 단지 struct입니다 수 있도록 변경되었습니다. 감사.

업데이트 : 3 나는 그들이 그들 중 일부는 (has profile, no profile, connected) 플래그를 가지고 예를 들어 다른 Flags,이,이 SSID 년대 중복되지 않기 때문에, 더 나은 해결책이 있어야한다고 생각합니다.

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

을 그리고 난이 상수 값으로 네트워크를 검사 할 때 난 단지 no profile 또는 has profile 또는 connected로 예를 들면 얻을 : 나는 또한 값으로 몇 가지 상수를 만들었습니다.하지만 has profile으로 표시하려면 수표가 필요하고 no profile으로는 새로운 수표가 필요합니다. 어떤 아이디어? 감사.

업데이트 : 4 : 내가 지원하는 응용 프로그램을 재 설계 한 같은 APs (프로파일 포함). 문제가 해결되었습니다.

답변

0

QMap 또는 QHash과 같은 중복 제외를 지원하는 추가 컨테이너를 사용해야합니다.

트리 위젯에 항목을 삽입하기 전에 맵/해시 테이블에 SSID가 아직 키로 존재하지 않는지 확인하십시오. 해당 SSID가 있음을 확인하면 삽입하지 마십시오.

+0

확인. 나는 그것을 시도하고 대답 할 것이다. 감사. – Cobra91151

+0

나는 당신의 제안을 확인했지만, QMap에 삽입 할 때 나의 경우 키가 다르다. 그래서 나는 그것을 비교할 수 없다. 내 주요 게시물의 코드 예제. – Cobra91151

+0

"내 경우 키가 다릅니다"? 하지만 중복 제거에 관한 질문이 아닙니까? 따라서 SSID는 두 번 이상 올 수 있습니다. 또한'QMap'을 사용하면 삽입에주의해야합니다. 같은 키가있는 새 항목을 삽입하면 키가 이미 존재하는지 문서에 명시되어 있으므로 맵에 저장된 항목 만 바뀝니다. 그래서'QMap :: contains'를 사용하는 것은 확실히 insert를 호출하기 전에 사용해야 할 것입니다. – rbaleksandar