2014-10-01 1 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, я все равно получаю тот же отладочный вывод, который показывает, что текст был изменен, но слэш не отображается в строкеEdit. QCompleter как-то отключил текст?

+0

Что делать, если вы нажмете клавишу Enter после завершения? Будет ли добавлена ​​косая черта? – Ezee

+0

Прошу прощения, я знаю, что это не связано, но вам действительно нужно перевести «C: \\» в окончательное приложение? Корневой путь Windows не связан с языком пользователя. – Antwane

+0

Нет, это просто привычка, когда я пишу код qt. В любом случае диск c является просто заполнителем, в конечном приложении это будет настройка конфигурации. –

ответ

0

Это взлом, но добавление этого соединения в QCompleter дает желаемое поведение. Я думаю, что есть условие гонки при использовании editFinished() в то же время, когда QCompleter активирован, поэтому добавление задержки позволяет добавить косую черту без переопределения. С другой стороны, эта функция знает, что ее вызывают несколько раз для каждого изменения. Меня все равно будет интересовать лучшее решение.

connect(fileSystemCompleter, activatedOverloadPtr, [&](QModelIndex index) 
{ 
    QTimer* timer = new QTimer; 
    timer->setSingleShot(true); 
    timer->setInterval(10); 
    connect(timer, &QTimer::timeout, fileSystemPathEdit, &QLineEdit::editingFinished); 
    timer->start(); 
}); 
Смежные вопросы