QFileDialog не перечисляет tty * файлы в / dev / в Linux - PullRequest
2 голосов
/ 11 октября 2011

Я работаю над настольным приложением Linux, которому нужно открыть последовательный порт USB, обычно / dev / ttyUSB0 или / dev / ttyUSB1.Я использую QFileDialog, чтобы позволить пользователю выбрать файл:

QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setFilter(QDir::System | QDir::AllEntries | QDir::Hidden);
dialog.setViewMode(QFileDialog::Detail);
QStringList fileNames;
if (dialog.exec())
  fileNames = dialog.selectedFiles();

Когда я указываю FileDialog в / dev, ни один из файлов, которые я могу увидеть, набрав «ls / dev -al», не найдется,Каталоги отображаются, но, например, этого файла нет:

$  ls -al /dev/ttyS0
crw-rw---- 1 root dialout 4, 64 2011-10-09 10:47 /dev/ttyS0

Мой пользователь является членом группы дозвона:

$ groups
luke adm dialout cdrom audio video plugdev users fuse netdev bluetooth lpadmin admin sambashare

Я пытался добавить QDir:: Readable и QDir :: Writable, и указанный выше файл все еще не отображается.Что я делаю не так?

1 Ответ

2 голосов
/ 01 ноября 2012

Меня удивляет, как часто люди не отвечают на первоначально заданный вопрос.Я постараюсь не делать этого здесь, если смогу.Я сделал домашнее задание по этой проблеме, так как у меня точно такая же проблема.Краткий ответ: вы не можете использовать QFileDialog для надежного вывода списка и выбора узлов в «/ dev».Когда вы устанавливаете бит «QDIR :: System» в фильтре QFileDialog, используя QFileDialog::setFilter(QDIR::System), вы ожидаете, что все файлы в / dev будут отображаться, но они этого не делают.По общему признанию, есть больше записей, чем когда это не установлено, но большинство узлов устройства все еще не отображаются.Ясно, что QFileDialog выполняет некоторую дополнительную фильтрацию за кулисами, и что эта фильтрация не может быть отключена каким-либо очевидным способом.

С другой стороны, если вы используете класс QDir с установленным битом фильтра QDir :: System, то фактически все записи / dev появляются в entryList.Например, предполагая, что у вас уже есть QComboBox с именем TTYDevices в вашем пользовательском интерфейсе, попробуйте что-то вроде этого:

DevDir=new QDir("/dev","tty*",QDir::Name,QDir::System);
ui->TTyDevices->addItems(DevDir->entryList());

Затем используйте стандартные сигналы от QComboBox, чтобы обнаружить и действовать при выборе нужного узла устройства.Кстати, ui - это стандартный указатель Qt на экземпляр класса вашего родительского окна, который должен быть установлен в конструкторе Window.Просто убедитесь, что вы не ссылаетесь на него, прежде чем конструктор вызовет ui->setupUi(this).Если вы это сделаете, программа завершится сбоем.

Этот прием предоставляет функции, идентичные QFileDialog, с дополнительными функциями, предоставляемыми непосредственным доступом к объекту QDir.Это означает, что вы не можете легко иметь такой же знакомый, унифицированный интерфейс, предоставляемый QFileDialog, но он работает и удивительно легко кодируется.

...