Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2013, 22:29   #1
Zurich
Пользователь
 
Регистрация: 05.03.2013
Сообщений: 13
По умолчанию Слайд-шоу

Здравствуйте!
Интересует создание слайд-шоу. Как сделать с заданными именами файлов и директорией, понятно. Но мне нужно следующее: указываем только путь до папки с рисунками, а программа сама перебирает все рисунки с фиксированной задержкой. Как этого добиться?
Zurich вне форума Ответить с цитированием
Старый 19.07.2013, 09:16   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

QFileInfoList QDir::entryInfoList ( Filters filters = NoFilter, SortFlags sort = NoSort ) const :
Код:
QFileInfoList RecursDirSearch(QDir strtD){

    QFileInfoList ls = strtD.entryInfoList();
    QFileInfoList ls2;
    foreach(QFileInfo fi, ls){
        QString hj = fi.absoluteFilePath();
        QString hjfile = ;
        if (fi.isDir()
#ifdef OS_WIN
            && (fi.fileName() !=".") &&
            (fi.fileName() !="..")
#else
// проверка на какие-то свои особенности платформы
#endif
            )
            ls2 << RecursDirSearch(fi.absoluteFilePath());
    }

    for (int i = ls.count() - 1; i >= 0 ; i--)
    {
        if (ls.value(i).isFile())
        {
            ls2<<ls.value(i);
        }
    }

    return ls2;
}
рекурсивный поиск файла то есть использовать.

Ваша реализация с флагами может быть удачнее)

Последний раз редактировалось Smogg; 19.07.2013 в 09:21.
Smogg вне форума Ответить с цитированием
Старый 19.07.2013, 12:54   #3
Zurich
Пользователь
 
Регистрация: 05.03.2013
Сообщений: 13
По умолчанию

А про какие "мои" флаги Вы написали? Не могли бы несколько слов подробнее по реализации, я в Qt пока новичок. Вот у меня есть код:
Код:
QString FileName=QFileDialog::getOpenFileName(this, "title", "text");//, "Bitmap Images(*.bmp)"
 Image = QImage(FileName);
     QGraphicsScene *scene = new QGraphicsScene(this);
     scene->addPixmap(QPixmap::fromImage(Image));
     ui->graphicsView->setScene(scene);
Мне нужно, чтобы выбирался не файл, а папка и в ней происходил перебор рисунков. Если можно, с минимальными комментариями. Спасибо за понимание!
Zurich вне форума Ответить с цитированием
Старый 20.07.2013, 15:16   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Мда, функция, которую я чуть раньше написал, возвращает также и эти самые "\." и "\.."... Да и вообще корявая

"Флаги" - это вся шляпа, которая подчеркнута: QFileInfoList QDir::entryInfoList ( Filters filters = NoFilter, SortFlags sort = NoSort ) const

Конечно, можно использовать и QStringList QDir::entryList ( Filters filters = NoFilter, SortFlags sort = NoSort ) const, но тогда придется самому выковыривать расширение из пути. Впрочем, через регулярки это фигня.

Код:
QFileInfoList RecursDirSearch(QDir strtD){
//читаем список файлов
	QFileInfoList ls = strtD.entryInfoList();
//создаем возвращаемый список (т.к. объем списка не известен, то лучше создавать его в куче, т.е. через new, но это уже на дальнейший апдейт по желанию)
	QFileInfoList ls2;
	foreach(QFileInfo fi, ls){
//не обращаем внимания на каталоги "\." и "\.."
#ifdef OS_WIN
		if ((fi.fileName() ==".") ||
			(fi.fileName() ==".."))
			continue;
#else
		// проверка на какие-то свои особенности платформы
#endif
// Проверяем что элемент списка - каталог, тогда запускаем рекурсию на него и вставляем возвращаемый из рекурсии список в основной возвращаемый список, иначе - это файл, и тогда его просто добавляем в основной возвращаемый список
		if (fi.isDir())
			ls2 << RecursDirSearch(fi.absoluteFilePath());
		else
			ls2 << fi;
	}

	return ls2;
}

QList<QImage> getAllPic(QDir startDir = QDir()){
// Если startDir не указан, то открываем диалог выбора. 
	if (startDir == QDir())
	{
		QString DirName=QFileDialog::getExistingDirectory(0, "title", "text");
		if (!DirName.size())
			return QList<QImage>();
		else
			startDir.setPath(DirName);
	}

	QList<QImage> lstImgReturn;

// рекурсивно получаем список 
	QFileInfoList lstFileInf = RecursDirSearch(startDir);
//объявлем регулярное выражение, где через сиимвол | перечисляем расширения, тут - картинки.
	QRegExp rx ("^(bmp|jpg)$");

// тестируем, что если расширение удовлетворяет регэкспу, то добавляем QImage в список.
	for (int i = 0; i < lstFileInf.count() ; i++)
	{
		if (lstFileInf.value(i).suffix().contains(rx))
		{
			lstImg << QImage(lstFileInf.value(i).absoluteFilePath());
		}
	}
// радуемся!!
	return lstImgReturn;

}

Последний раз редактировалось Smogg; 20.07.2013 в 15:19.
Smogg вне форума Ответить с цитированием
Старый 20.07.2013, 17:45   #5
Zurich
Пользователь
 
Регистрация: 05.03.2013
Сообщений: 13
По умолчанию

Спасибо огромное за такой подробный ответ! Еще несколько уточнений:
1) Что именно лежит на выходе в 1stImgReturn и как мне связать ее с моей требуемой FileName?
2) Компиллятор ругается на 1stImage. Действительно, он нигде не определен. Извиняюсь, если чего-то не увидел. Вы используете такие типы, которые мне пока малознакомы (например, QList, QdDir). Классы для них я нашел, сделал # include, с этим вроде все нормально, но,
3) насколько я понимаю, надо прописать прототипы функций в h-файл, а он почему-то не хочет воспринимать вот такое:
Код:
protected:
QFileInfoList RecursDirSearch(QDir strtD);
QList<QImage> getAllPic(QDir startDir = QDir());
Что не так делаю?

Потом я работаю в файле для моей формы, где задан класс этой формы Form. Значит, мне надо писать функции как-то так:
QFileInfoList Form::RecursDirSearch(QDir strtD) ??

Спасибо и прошу прощения за свою непонятливость.
Zurich вне форума Ответить с цитированием
Старый 20.07.2013, 20:13   #6
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Zurich Посмотреть сообщение
1) Что именно лежит на выходе в 1stImgReturn и как мне связать ее с моей требуемой FileName?
2) Компиллятор ругается на 1stImage. Действительно, он нигде не определен. Извиняюсь, если чего-то не увидел. Вы используете такие типы, которые мне пока малознакомы (например, QList, QdDir). Классы для них я нашел, сделал # include, с этим вроде все нормально, но,
Это я комментарии дописывал уже браузере, и там же заменил исходное lstImage на более осмысленное lstImageReturn... Невнимательность меня когданить окончательно погубит.

А зачем вам FileName, когда нужно DirName? Переменные, кстати, с цифр не начинаются.
Цитата:
3) насколько я понимаю, надо прописать прототипы функций в h-файл, а он почему-то не хочет воспринимать вот такое:
Код:
protected:
QFileInfoList RecursDirSearch(QDir strtD);
QList<QImage> getAllPic(QDir startDir = QDir());
Что не так делаю?
Вполне нормальное объявление.

Может на это QDir startDir = QDir() ругается? Моя студия даже варнингов не выдает.
А какая ошибка?

Цитата:
Потом я работаю в файле для моей формы, где задан класс этой формы Form. Значит, мне надо писать функции как-то так:
QFileInfoList Form::RecursDirSearch(QDir strtD) ??
Это зависит от того, в каком месте объявили функцию. Если объявили как член класса, то и реализовывать надо как член класса.

И еще: GetAllPic - чисто проверочная функция. Хранить все картинки в памяти во время слайд-шоу не стоит.

// Извините, что и я использую форум для самообучения, отчего и ответы содержат те моменты, в которых я сам хотел бы разобраться. Естественно, что баги всплывают в процессе тестов.
Иначе было бы не интересно)
Smogg вне форума Ответить с цитированием
Старый 20.07.2013, 22:30   #7
Zurich
Пользователь
 
Регистрация: 05.03.2013
Сообщений: 13
По умолчанию

Цитата:
Может на это QDir startDir = QDir() ругается? Моя студия даже варнингов не выдает.
А какая ошибка?
Да, пишет, что нет конструктора.

Цитата:
Это зависит от того, в каком месте объявили функцию. Если объявили как член класса, то и реализовывать надо как член класса.
Переделал, засунул в класс, если так можно выразиться.

Цитата:
А зачем вам FileName, когда нужно DirName? Переменные, кстати, с цифр не начинаются.
Мне FileName не на вход, а на выход нужен. Я же должен как-то вывести картинку на экран. По идее, мне потом нужен будет таймер, но пока я никак не могу понять, как мне работать со списком файлов, да и где собственно он. ls2 у первой функции - это как раз список, так? Что это реально? Что-то вроде текстового файла с записанными именами построчно? Почему вторая функция возвращает (судя по названию) только один image?

PS: Я вложил проект, иначе Вам совсем непонятно будет, во что я уперся.
Вложения
Тип файла: rar untitled.rar (5.0 Кб, 7 просмотров)

Последний раз редактировалось Zurich; 20.07.2013 в 23:49.
Zurich вне форума Ответить с цитированием
Старый 21.07.2013, 02:20   #8
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
QDir d = "c:\img";
Во-первых, постарайтесь запомнить, что слеш, также как и двойные/одинарные кавычки экранируются слешем. Всегда! И при это в разных местах и языках по разному. Например, проверка регуляркой, что имя файла начинается с C:\ будет выглядеть так: QRegExp("^C:\\\\"). Я каждый раз улыбаюсь, когда считаю сколько тут слешей.
Во вторых, такой слеш \ и такой / для файловой системы винды одно и то же.
В третьих, нельзя напрямую присваивать строку QDir'y, потому что у него нету такого оператора по дефолту.
В четвртых, было интересно побаловаться с графикой, а то я все сплошь стринги да юникоды мучаю. А так все руки не доходили, максимум - присвоения QPixMap'a иконке.
В пятых, базово - работает. Для минимальной функциональности надо приделать вызов диалога выбора директории, QSettings для сохранения директории и настроить рандом выбора картинки.
//В шестых, удостоверится, что на добавлении 50.000 картинок в список не вывалится по переполнению. Я не знаю. По идее - не должно, но С++ такой С++))
Вложения
Тип файла: zip src.zip (5.8 Кб, 13 просмотров)

Последний раз редактировалось Smogg; 21.07.2013 в 17:57.
Smogg вне форума Ответить с цитированием
Старый 21.07.2013, 18:13   #9
Zurich
Пользователь
 
Регистрация: 05.03.2013
Сообщений: 13
По умолчанию

Спасибо Вам большое! Все работает так, как мне нужно. Теперь буду разбираться с кодом. Боюсь, что не обойдусь без дополнительных вопросов Еще раз спасибо!
Zurich вне форума Ответить с цитированием
Старый 21.07.2013, 20:48   #10
Zurich
Пользователь
 
Регистрация: 05.03.2013
Сообщений: 13
По умолчанию

Вы не могли бы "расшифровать" вот эту строку:
Код:
 QTimer::singleShot(50, this, SLOT(showPic()));
Я понимаю, что это и есть как раз вывод слайдов, но как именно это работает? (PS: Знаю, что по хорошему надо лучше изучить, как работают сигналы и слоты, но тем не менее).
Zurich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слайдер со слайд шоу fs444 JavaScript, Ajax 0 28.02.2013 17:18
Слайд шоу (JS) vprsc JavaScript, Ajax 3 26.11.2012 01:07
слайд шоу violettta HTML и CSS 4 06.01.2012 15:08
Слайд-шоу Алекссс Помощь студентам 2 01.11.2011 16:43
Слайд-шоу Алекссс Мультимедиа в Delphi 0 01.11.2011 12:02