2011-10-11 47 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相同的熟悉的統一接口,但它的工作原理非常易於編寫。

相關問題