【问题标题】:QFileDialog doesn’t list tty* files in /dev/ on LinuxQFileDialog 不会在 Linux 上的 /dev/ 中列出 tty* 文件
【发布时间】:2012-11-02 02:10:59
【问题描述】:

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

【问题讨论】:

  • 如果您阅读我的帖子,您会发现我已经将 QDir:System 作为 setFilter() 的参数。还有其他地方应该使用吗?
  • 不确定这是否会有所帮助,但从一些谷歌搜索来看,似乎建议使用库 qextserialport 来处理 Qt 应用程序中的串行端口。
  • @n.m. QDir::DefaultFilter 未定义。
  • @ClareMacrae 我看到了,我将不得不更仔细地研究它。 qt 开发者论坛没有回复,所以我倾向于认为这是某种错误。我在这里提交了一个错误报告:bugreports.qt.nokia.com/browse/QTBUG-21970
  • QDir::DefaultFilter 应该定义为(-1),如果不是,就使用-1。

标签: linux qt4 tty qfiledialog


【解决方案1】:

令我惊讶的是,人们经常不回答最初提出的问题。如果可以的话,我会尽量不在这里这样做。因为我遇到了完全相同的问题,所以我已经对这个问题做了一些功课。简短的回答是您不能使用 QFileDialog 可靠地列出和选择“/dev”中的节点。当您使用QFileDialog::setFilter(QDIR::System) 在 QFileDialog 过滤器中设置“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 相同的熟悉、统一的界面,但它可以工作并且非常容易编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多