2

我正在开发一个需要打开 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 并且上面的文件仍然没有出现。我究竟做错了什么?

4

1 回答 1

2

令我惊讶的是,人们经常不回答最初提出的问题。如果可以的话,我会尽量不在这里这样做。因为我遇到了完全相同的问题,所以我已经对这个问题做了一些功课。简短的回答是您不能使用 QFileDialog 可靠地列出和选择“/ dev”中的节点。当您使用 设置 QFileDialog 过滤器中的“QDIR::System”位时 QFileDialog::setFilter(QDIR::System),您会期望 /dev 中的所有文件都会显示,但它们不会显示。诚然,条目比未设置时多,但大部分设备节点仍然没有显示。很明显,QFileDialog 在幕后做了一些额外的过滤,而且这种过滤不能以任何明显的方式关闭。

另一方面,如果您使用设置了 QDir::System 过滤器位的 QDir 类,那么实际上所有 /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 相同的熟悉、统一的界面,但它可以工作并且非常容易编码。

于 2012-11-01T17:20:56.463 回答