Russian Qt Forum

Qt => Базы данных => Тема начата: dsp от Июнь 09, 2011, 12:22



Название: Преобразование типа
Отправлено: dsp от Июнь 09, 2011, 12:22
Хочу что бы в ячейку таблицы выводился размер файла и соответствующая единица измерения.
Сделал так (может как-то проще можно сделать):

Код:
    qint64 size = QFileInfo(currentDir.absoluteFilePath(file)).size();  

    QString sizeMKB;

    QString MKB[3] = {"MB", "KB", "B"};   

    if(size > 1024*1024 - 1)
        sizeBKM = QString::number(size/(1024*1024), 'f', 4) + " " + MKB[0];
    else if(size > 1023)
        sizeBKM = QString::number(size / 1024, 'f', 4) + " " + MKB[1];
    else if(size < 1024)
        sizeBKM = QString::number(size) + " " + MKB[2];

    QTableWidgetItem *sizeItem = new QTableWidgetItem(QString("%1").arg(sizeMKB));




Но конечное значение, естественно, обрезается до целого, если начинать делить. получается 1.0000 МБ. 1.0000 КБ
Как быть?


Название: Re: Преобразование типа
Отправлено: GreatSnake от Июнь 09, 2011, 12:36
Тролли вот так делают:
Код
C++ (Qt)
   // According to the Si standard KB is 1000 bytes, KiB is 1024
   // but on windows sizes are calulated by dividing by 1024 so we do what they do.
const quint64 kb = 1024;
const quint64 mb = 1024 * kb;
const quint64 gb = 1024 * mb;
const quint64 tb = 1024 * gb;
quint64 bytes = n->info.size();
if (bytes >= tb)
return QFileSystemModel::tr("%1 TB").arg(QLocale().toString(qreal(bytes) / tb, 'f', 3));
if (bytes >= gb)
return QFileSystemModel::tr("%1 GB").arg(QLocale().toString(qreal(bytes) / gb, 'f', 2));
if (bytes >= mb)
return QFileSystemModel::tr("%1 MB").arg(QLocale().toString(qreal(bytes) / mb, 'f', 1));
if (bytes >= kb)
return QFileSystemModel::tr("%1 KB").arg(QLocale().toString(bytes / kb));
return QFileSystemModel::tr("%1 byte(s)").arg(QLocale().toString(bytes));
 


Название: Re: Преобразование типа
Отправлено: dsp от Июнь 09, 2011, 12:59
спасибо, но просто сделал так qreal(size)... работает спс.

Цитировать
   qint64 size = QFileInfo(currentDir.absoluteFilePath(file)).size();  

    QString sizeMKB;
    QString MKB[3] = {"MB", "KB", "B"};

    if(size > 1024*1024 - 1)
        sizeMKB = QString::number(qreal(size)/(1024*1024), 'f', 1) + " " + MKB[0];
    else if(size > 1023)
        sizeMKB = QString::number(qreal(size) / 1024, 'f', 1) + " " + MKB[1];
    else if(size < 1024)
        sizeMKB = QString::number(qreal(size)) + " " + MKB[2];

    QTableWidgetItem *sizeItem = new QTableWidgetItem(sizeMKB);


Название: Re: Преобразование типа
Отправлено: GreatSnake от Июнь 09, 2011, 13:04
Цитировать
QTableWidgetItem *sizeItem = new QTableWidgetItem(QString("%1").arg(sizeMKB));
Какой смысл делать копию sizeMKB?


Название: Re: Преобразование типа
Отправлено: dsp от Июнь 09, 2011, 13:14
Цитировать
QTableWidgetItem *sizeItem = new QTableWidgetItem(QString("%1").arg(sizeMKB));
Какой смысл делать копию sizeMKB?

так лучше
Код:
    QTableWidgetItem *sizeItem = new QTableWidgetItem(sizeMKB)