2014-10-01 115 views
0

我試圖自動向QLineEdit中的有效文件路徑添加反斜槓,該路徑用於顯示QFileSystemModel的當前路徑。QLineEdit:自動將反斜槓添加到目錄名稱

的代碼如下:

fileSystem = new QFileSystemModel; 
fileSystem->setRootPath(QObject::tr("C:\\")); 

QCompleter* fileSystemCompleter = new QCompleter(fileSystem); 
fileSystemCompleter->setCaseSensitivity(Qt::CaseInsensitive); 

fileTree = new QDeselectableTreeView(); 
fileTree->setModel(fileSystem); 
fileTree->setRootIndex(fileSystem->index(fileSystem->rootPath())); 
connect(fileTree, &QTreeView::clicked, [&] (QModelIndex index) 
{ 
    QString toAppend(""); 
    if (fileSystem->isDir(index)) 
    { 
     toAppend = '/'; 
    } 
    fileSystemPathEdit->setText(fileSystem->filePath(index)+toAppend); 
}); 

// path line edit 
fileSystemPathEdit = new QLineEdit(fileSystem->rootPath()); 
fileSystemPathEdit->setPlaceholderText("Path..."); 
fileSystemPathEdit->setCompleter(fileSystemCompleter); 
connect(fileSystemPathEdit, &QLineEdit::editingFinished, [&]() 
{ 
    // jump to that location 
    qDebug() << fileSystemPathEdit->text(); 
    QModelIndex index = fileSystem->index(fileSystemPathEdit->text()); 
    qDebug() << index; 
    fileTree->setExpanded(index,true); 
    fileTree->setCurrentIndex(index); 
    // CLOSE IF EMPTY 
    if (fileSystemPathEdit->text().isEmpty()) 
    { 
     fileTree->collapseAll(); 
     fileSystemPathEdit->setText(fileSystem->rootPath()); 
    } 
    // append slashes to dirs 
    else if (fileSystem->isDir(index) && index.isValid()) 
    { 
     qDebug() << "it's a dir"; 
     if (!fileSystemPathEdit->text().endsWith('/',Qt::CaseInsensitive)) 
     { 
      qDebug() << "added slash"; 
      fileSystemPathEdit->setText(fileSystemPathEdit->text().append('/')); 
      qDebug() << fileSystemPathEdit->text(); 
     } 
    } 
    this->update(); 
}); 

運行的代碼時,我得到以下輸出:

"C:/export/home" 
QModelIndex(0,0,0x3adb840,QFileSystemModel(0x1d9b7c0)) 
it's a dir 
added slash 
"C:/export/home/" 

,當我推從lineEdit內輸入關鍵,這工程確定,但如果文本是由QCompleter設置的,我仍然得到相同的調試輸出,顯示文本已被更改,但斜線未出現在lineEdit中。 QCompleter以某種方式取消設置文本?

+0

如果完成後按Enter鍵會怎麼樣?那麼會附加斜線嗎? – Ezee 2014-10-02 08:13:42

+0

對不起,我知道這是不相關的,但是你真的需要在最終的應用程序中翻譯「C:\\」嗎? Windows根路徑與用戶的語言無關。 – Antwane 2014-10-02 08:32:37

+0

不,這只是我編寫qt代碼時的一種習慣。無論如何,C盤只是一個佔位符,在最終的應用程序中將是一個配置設置。 – 2014-10-02 10:34:23

回答

0

這是一個黑客攻擊,但將此連接添加到QCompleter中會產生所需的行爲。我認爲在QCompleter被激活的同時使用editingFinished()時存在爭用條件,因此添加延遲允許斜槓被添加而不被覆蓋。在不利的方面,這個函數知道被調用幾次,每次更改很多次。我仍然對更好的解決方案感興趣。

connect(fileSystemCompleter, activatedOverloadPtr, [&](QModelIndex index) 
{ 
    QTimer* timer = new QTimer; 
    timer->setSingleShot(true); 
    timer->setInterval(10); 
    connect(timer, &QTimer::timeout, fileSystemPathEdit, &QLineEdit::editingFinished); 
    timer->start(); 
});