2015-06-20 84 views

回答

10

QFileInfo沒有一個具體方法爲,但here你可以找到一個簡單的實現子類QFileInfo和實施這種新方法

QString QFileInfoHumanSize::size_human() 
{ 
    float num = this->size(); 
    QStringList list; 
    list << "KB" << "MB" << "GB" << "TB"; 

    QStringListIterator i(list); 
    QString unit("bytes"); 

    while(num >= 1024.0 && i.hasNext()) 
    { 
     unit = i.next(); 
     num /= 1024.0; 
    } 
    return QString().setNum(num,'f',2)+" "+unit; 
} 
+6

將'list'作爲常量類成員會更好。沒有理由繼續創建列表,每次你想使用它,因爲列表總是相同的。 – RobbieE

+0

@RobbieE我想這是過早的優化。智能編譯器將刪除列表的多個創建,並使列表靜態使代碼不易讀 – bartop

-1

下面是一個最小的代碼,可以這樣做。

char unit; 
const char *units [] = {" Bytes", " kB", " MB", " GB"}; 
quint64 size = 102400; // or whatever 

for (unit=-1; (++unit<3) && (size>1023); size/=1024); 
qlabel->setText (QString::number (size, 'f', 1) + units[unit]); 
0

@danielfranca提供的代碼在使用int而不是float時會導致稍微不正確的結果。以下是報告的結果爲整數更精確的版本:

QString MyClass::convertFileSizeToHumanReadable(const qlonglong & bytes) 
{ 
    QString number; 

    if(bytes < 0x400) //If less than 1 KB, report in B 
    { 
     number = QLocale::system().toString(bytes); 
     number.append(" B"); 
     return number; 
    } 
    else 
    { 
     if(bytes >= 0x400 && bytes < 0x100000) //If less than 1 MB, report in KB, unless rounded result is 1024 KB, then report in MB 
     { 
      qlonglong result = (bytes + (0x400/2))/0x400; 

      if(result < 0x400) 
      { 
       number = QLocale::system().toString(result); 
       number.append(" KB"); 
       return number; 
      } 
      else 
      { 
       qlonglong result = (bytes + (0x100000/2))/0x100000; 
       number = QLocale::system().toString(result); 
       number.append(" MB"); 
       return number; 
      } 
     } 
     else 
     { 
      if(bytes >= 0x100000 && bytes < 0x40000000) //If less than 1 GB, report in MB, unless rounded result is 1024 MB, then report in GB 
      { 
       qlonglong result = (bytes + (0x100000/2))/0x100000; 

       if(result < 0x100000) 
       { 
        number = QLocale::system().toString(result); 
        number.append(" MB"); 
        return number; 
       } 
       else 
       { 
        qlonglong result = (bytes + (0x40000000/2))/0x40000000; 
        number = QLocale::system().toString(result); 
        number.append(" GB"); 
        return number; 
       } 
      } 
      else 
      { 
       if(bytes >= 0x40000000 && bytes < 0x10000000000) //If less than 1 TB, report in GB, unless rounded result is 1024 GB, then report in TB 
       { 
        qlonglong result = (bytes + (0x40000000/2))/0x40000000; 

        if(result < 0x40000000) 
        { 
         number = QLocale::system().toString(result); 
         number.append(" GB"); 
         return number; 
        } 
        else 
        { 
         qlonglong result = (bytes + (0x10000000000/2))/0x10000000000; 
         number = QLocale::system().toString(result); 
         number.append(" TB"); 
         return number; 
        } 
       } 
       else 
       { 
        qlonglong result = (bytes + (0x10000000000/2))/0x10000000000; //If more than 1 TB, report in TB 
        number = QLocale::system().toString(result); 
        number.append(" TB"); 
        return number; 
       } 
      } 
     } 
    } 
} 
0

的Qt 5.10先後引進ready solution

QLocale locale = this->locale(); 
QString valueText = locale.formattedDataSize(sizeValue); 
相關問題