2015-06-20 86 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); 
相关问题