2014-10-01 113 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(); 
});