我正在开发一个需要打开USB串口的Linux桌面应用程序,通常是/ 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,上面的文件仍然没有显示出来。我做错了什么?
答案 0 :(得分:2)
令人惊讶的是,人们不经常回答最初提出的问题。如果可以的话,我会尽量不这样做。我已经完成了关于这个问题的一些功课,因为我遇到了完全相同的问题。简短的回答是你不能使用QFileDialog可靠地列出和选择“/ dev”中的节点。当您使用QFileDialog::setFilter(QDIR::System)
在QFileDialog过滤器中设置“QDIR :: System”位时,您会希望/ dev中的所有文件都会显示,但它们不会显示。不可否认,条目比未设置的条目多,但大多数设备节点仍未显示。很明显,QFileDialog正在幕后进行一些额外的过滤,并且这种过滤不能以任何明显的方式关闭。
另一方面,如果您使用QDir类并设置了QDir :: System过滤器位,那么实际上所有/ dev条目都会出现在entryList中。例如,假设您的用户界面中已经有一个名为TTYDevices的QComboBox,请尝试以下方法:
DevDir=new QDir("/dev","tty*",QDir::Name,QDir::System);
ui->TTyDevices->addItems(DevDir->entryList());
然后使用来自QComboBox的标准信号来检测并选择所需的设备节点。顺便说一句,ui是指向父窗口类实例的标准Qt指针,应该在Window的构造函数中设置。只需确保在构造函数调用ui->setupUi(this)
之前不引用它。如果你这样做,程序将崩溃。
此技巧为QFileDialog提供了相同的功能,并通过直接访问QDir对象提供了其他功能。它确实意味着您无法轻松拥有QFileDialog提供的相同熟悉的统一界面,但它的工作原理非常简单。