Как стать автором
Поиск
Написать публикацию
Обновить

minimizeName на Qt и C++

Многие дельфисты, «портировавшиеся» на 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.

Пожалуйста, пользуйтесь на здоровье и берегите нервы.

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;
}
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.