0

の有効なファイル パスにバックスラッシュを自動的に追加しようとしていますQLineEdit。これは、の現在のパスを表示するために使用されQFileSystemModelます。

コードは次のようになります。

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/"

EnterlineEdit内からキーを押すと問題なく動作しますがQCompleter、テキストが. どういうわけかQCompleterテキストの設定を解除しますか?

4

1 に答える 1

0

これはハックですが、この接続を QCompleter に追加すると、望ましい動作が得られます。QCompleter のアクティブ化と同時にeditingFinished()を使用すると競合状態になると思うので、遅延を追加することでオーバーライドせずにスラッシュを追加できます。欠点として、その関数 know は、変更ごとに数回から多数回呼び出されます。私はまだより良い解決策に興味があります。

connect(fileSystemCompleter, activatedOverloadPtr, [&](QModelIndex index)
{
    QTimer* timer =  new QTimer;
    timer->setSingleShot(true);
    timer->setInterval(10);
    connect(timer, &QTimer::timeout, fileSystemPathEdit,  &QLineEdit::editingFinished);
    timer->start();
});
于 2014-10-02T13:17:26.273 に答える