Russian Qt Forum
Ноябрь 24, 2024, 06:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование типа  (Прочитано 2672 раз)
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 КБ
Как быть?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Июнь 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));
 
Записан

Qt 5.11/4.8.7 (X11/Win)
dsp
Гость
« Ответ #2 : Июнь 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);
« Последнее редактирование: Июнь 09, 2011, 13:14 от dsp » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июнь 09, 2011, 13:04 »

Цитировать
QTableWidgetItem *sizeItem = new QTableWidgetItem(QString("%1").arg(sizeMKB));
Какой смысл делать копию sizeMKB?
Записан

Qt 5.11/4.8.7 (X11/Win)
dsp
Гость
« Ответ #4 : Июнь 09, 2011, 13:14 »

Цитировать
QTableWidgetItem *sizeItem = new QTableWidgetItem(QString("%1").arg(sizeMKB));
Какой смысл делать копию sizeMKB?

так лучше
Код:
    QTableWidgetItem *sizeItem = new QTableWidgetItem(sizeMKB)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.165 секунд. Запросов: 23.