Многие дельфисты, «портировавшиеся» на Qt, сталкиваются с отсутствием любимых «дельфовских» функций в Qt.
К числу таковых, думаю, стоит причислить такую функцию как MinimizeName, многими применявшуюся для отображения длинного пути к файлу на заведомо коротких канвах TLabel и иных визуальных компонентах. Разумеется, каждый может написать свою функцию, но стоит ли изобретать каждый раз велосипед. Да и запросами на подобные функции пестрят форумы программистов.
Поясню суть происходящего. Например, приложение предлагает интерфейс выбора рабочего файла и отображает на компоненте TLabel путь к нему. Но TLabel короткий и не умещает полный путь к файлу, тогда мы отобразим урезанным красиво:
Выбрали файл по такому пути
«D:\Documents and Settings\qq\My Documents\My Photos.Archive\2011\2011-02-20 в гостях у мышки\IMG_3838.JPG»
Отображаем красиво на короткой канве TLabel
«D:\...\2011-02-20 в гостях у мышки\IMG_3838.JPG»
Т.е. путь красиво урезается до минимально длины так, чтобы отобразилось имя файла, имя диска, и последняя папка содержащая файл или две папки или ни одной в зависимости от ширины в пикселях TLabel.Caption.
А вот и портированный код. Код работает с компонентом Qt QLineEdit. Переделать его под что то другое пара пустяков. Код не учитывает особенности путей в *nix.
Пожалуйста, пользуйтесь на здоровье и берегите нервы.
К числу таковых, думаю, стоит причислить такую функцию как MinimizeName, многими применявшуюся для отображения длинного пути к файлу на заведомо коротких канвах TLabel и иных визуальных компонентах. Разумеется, каждый может написать свою функцию, но стоит ли изобретать каждый раз велосипед. Да и запросами на подобные функции пестрят форумы программистов.
Поясню суть происходящего. Например, приложение предлагает интерфейс выбора рабочего файла и отображает на компоненте TLabel путь к нему. Но TLabel короткий и не умещает полный путь к файлу, тогда мы отобразим урезанным красиво:
Выбрали файл по такому пути
«D:\Documents and Settings\qq\My Documents\My Photos.Archive\2011\2011-02-20 в гостях у мышки\IMG_3838.JPG»
Отображаем красиво на короткой канве TLabel
«D:\...\2011-02-20 в гостях у мышки\IMG_3838.JPG»
Т.е. путь красиво урезается до минимально длины так, чтобы отобразилось имя файла, имя диска, и последняя папка содержащая файл или две папки или ни одной в зависимости от ширины в пикселях TLabel.Caption.
А вот и портированный код. Код работает с компонентом Qt QLineEdit. Переделать его под что то другое пара пустяков. Код не учитывает особенности путей в *nix.
Пожалуйста, пользуйтесь на здоровье и берегите нервы.
void cutFirstDirectory(QString &S){
bool root;
int P;
if(S == "/") S = "";
else {
if(QString(S.toAscii().at(0)) == "/"){
root = true;
S.remove(0, 1);
} else
root = false;
if(QString(S.at(0)) == ".")
S.remove(0, 4);
P = S.indexOf("/");
if(P++){
S.remove(0, P);
S = ".../" + S;
} else
S = "";
if(root)
S = "/" + S;
}
}
QString minimizeName(QString &fileName, QLineEdit* lineEdit, int maxLen)
{
QString result = fileName;
QFontMetrics fm = lineEdit->fontMetrics();
QFileInfo pathInfo(fileName);
QString name = pathInfo.fileName();
QDir qdir = pathInfo.absoluteDir();
QString dir = qdir.path() + "/";
QString driveLetter;
if((dir.length() >= 2) && (QString(dir.toAscii().at(1)) == ":")){
driveLetter = dir.mid(0, 2);
dir.remove(0, 2);
} else
driveLetter = "";
int pixelsWide = fm.width(result);
while (((dir != "") || (driveLetter != "")) && (pixelsWide > maxLen)){
if(dir == "/.../"){
driveLetter = "";
dir = ".../";
}
else
if (dir == "") driveLetter = "";
else
cutFirstDirectory(dir);
result = driveLetter + dir + name;
pixelsWide = fm.width(result);
}
return result;
}