2011-10-11 89 views
2

我正在开发需要打开USB串行端口的Linux桌面应用程序,通常是/ dev/ttyUSB0或/ dev/ttyUSB1。我使用QFileDialog,让用户选择文件:QFileDialog没有在Linux的/ dev /目录中列出tty *文件

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 ::可读和一个QDir ::可写,上面的文件仍然不显示。我究竟做错了什么?

+0

如果您阅读我的文章,您会看到我已经有QDir:System作为setFilter()的参数。是否有另一个地方应该使用? – hazelnusse

+0

不知道这是否会有所帮助,但是从一些Google搜索中,似乎推荐使用库[qextserialport](http://code.google.com/p/qextserialport/)处理Qt应用程序中的串行端口。 –

+0

@ n.m。 QDir :: DefaultFilter是未定义的。 – hazelnusse

回答

2

令人惊讶的是,人们不会回答最初提出的问题的频率。如果可以的话,我会尽力避免这样做。我在这个问题上做了一些功课,因为我有完全相同的问题。简单的答案是,您不能使用QFileDialog来可靠地列出和选择“/ dev”中的节点。当您使用QFileDialog::setFilter(QDIR::System)在QFileDialog筛选器中设置“QDIR :: System”位时,您会希望/ dev中的所有文件都显示出来,但它们不会。无可否认,有更多的条目比没有设置时多,但大多数设备节点仍然没有显示。很明显,QFileDialog在幕后进行了一些额外的过滤,并且这种过滤不能以任何明显的方式关闭。另一方面,如果使用QDir :: System过滤器位设置的QDir类,那么实际上所有的/ 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相同的熟悉的统一接口,但它的工作原理非常易于编写。

相关问题