Название: Установка фокуса на элемент в QFileDialog Отправлено: Ground от Ноябрь 28, 2012, 09:29 Доброго дня!
Реализую следующее поведение QFileDialog: чтобы пользователь лишний раз не шарился по папкам, я хочу не дать ему открывать папки пустые и с определенным содержимым. Для чего прослушиваю сигнал directoryEntered. В коде это реализуется примерно так: Код Другими словами, если пользователь пытается открыть папку, а в ней ничего нет, или лежит один только файлик, то мы принудительно его оставляем в текущей директории. При таком подходе только одна проблема. Когда пользователь пытается открыть папку - он устанавливает фокус на эту папку (она выделяется и в текстовом поле появляется название этой папки). Так вот, когда мы перебрасываем пользователя с помощью setDirectory - данные о фокусе мы теряем. И поэтому вопрос - как программно установить фокус на какую-нибудь папку? Или как сделать так, чтобы при попытке зайти в определенную директорию - QFileDialog не пытался ее открыть? Название: Re: Установка фокуса на элемент в QFileDialog Отправлено: GreatSnake от Ноябрь 28, 2012, 10:34 Другими словами, если пользователь пытается открыть папку, а в ней ничего нет, или лежит один только файлик, то мы принудительно его оставляем в текущей директории. А почему нельзя вообще запретить выбирать такие папки?Название: Re: Установка фокуса на элемент в QFileDialog Отправлено: Ground от Ноябрь 28, 2012, 10:46 А почему нельзя вообще запретить выбирать такие папки? Что именно вы имеете ввиду: скрыть такие папки в окне QFileDialog или именно запретить выбирать? Если скрыть - этот вариант не подходит, т.к. у пользователя должна быть возможность выбрать эту папку для открытия. А если запретить выбирать - это то что нужно, как такое реализовать?Название: Re: Установка фокуса на элемент в QFileDialog Отправлено: GreatSnake от Ноябрь 28, 2012, 13:35 Что именно вы имеете ввиду: скрыть такие папки в окне QFileDialog или именно запретить выбирать? Если скрыть - этот вариант не подходит, т.к. у пользователя должна быть возможность выбрать эту папку для открытия. А если запретить выбирать - это то что нужно, как такое реализовать? Наверное всё-таки имеется в виду "вход" в выбранную папку.После некоторого исследования могу констатировать, что к сожалению легальными средствами сделать это не получится :( Т.е. сделать такой элемент невыбираемым или "засеренным" можно, но double-click отрабатывает всегда. Название: Re: Установка фокуса на элемент в QFileDialog Отправлено: Ground от Ноябрь 28, 2012, 14:07 Наверное всё-таки имеется в виду "вход" в выбранную папку. После некоторого исследования могу констатировать, что к сожалению легальными средствами сделать это не получится :( Т.е. double-click отрабатывает всегда. Я тут покопался в исходниках немного, нашел следующий способ. Код
Прежде всего, коннектимся к сигналу currentChanged, где запоминаем имя выделенной директории и через SelectionModel получаем порядковый номер выделенного файла. Еще нам нужно перехватить directoryEntered(QString), в котором будет сосредоточена основная работа. Проверяем, нужно ли нам открывать эту директорию. Если не нужно - оставляем пользователя в текущей директории: this->setDirectory(mOldPath), восстанавливаем ModelIndex и имя файла в lineEdit. Причем, чтобы обойти очистку lineEdit в исходниках (строка 2918-2919), подключим directoryEntered с режимом Qt::QueuedConnection. Вот такой костыль получился. Вроде бы я пробежался по тексту QFileDialog, проблем с QueuedConnection быть не должно - там всего 2 вызова directoryEntered. И все это в коде, может кому-нибудь пригодится: Код
|