为什么带有 QCompleter 的自动完成功能的 QLineEdit 不显示?

Amo*_*kar 3 c++ qt autocomplete

QLineEdit我的程序中有两个slineEdit和fileName_Edit。lineEdit保存目录路径(从用户处获取)。然后用户在 .txt 文件中输入文件名fileName_Edit。我想在用户输入文件名时向他显示建议fileName_Edit。QCompleter我尝试像这样实现
:(dirContents是一个QStringList保存用户指定的目录内容的目录lineEdit)

void MainWindow::on_lineEdit_textChanged(const QString &arg1)
{
    QCompleter *fileEditCompleter = new QCompleter(dirContents, this);
    fileEditCompleter->setCaseSensitivity(Qt::CaseInsensitive);
    fileEditCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
    ui->fileName_Edit->setCompleter(fileEditCompleter);
}
Run Code Online (Sandbox Code Playgroud)

程序编译成功,但完成程序未显示。即使我尝试将textChanged信号连接到如下所示的函数,它也不会显示。

QObject::connect(&MainWindow::ui->lineEdit, SIGNAL(&textChanged(QString)), this,SLOT(&MainWindow::on_lineEdit_editingFinished())); 
Run Code Online (Sandbox Code Playgroud)

编辑:添加上面的行会出现错误:

预期的构造函数、析构函数或类型转换之前(标记

任何帮助将不胜感激。

Che*_*byl 6

首先尝试简单地完成它,如果代码有效,那么一切都很好,您可以开始改进它。

在构造函数中:

QDir dir("G:/2");//path here
QStringList dirContents = dir.entryList(QStringList(), QDir::Files);
qDebug() << dirContents;//make sure that you list isn't empty, or use isEmpty method
QCompleter *fileEditCompleter = new QCompleter(dirContents, this);
fileEditCompleter->setCaseSensitivity(Qt::CaseInsensitive);
fileEditCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
ui->lineEdit->setCompleter(fileEditCompleter);
Run Code Online (Sandbox Code Playgroud)

如果这适用于您的计算机,那么您可以确定您的系统和项目良好,并开始改进它(更改列表等)。并且尽量不要使用全局变量。

如果您想动态执行此操作,请创建一个简单的模型,当您为其设置新模型时QStringList,您的完成器始终会显示新数据

QDir dir("G:/2");
QStringList dirContents = dir.entryList(QStringList(), QDir::Files);

mdl = new QStringListModel(dirContents,this);//QStringListModel *mdl in header

QCompleter *fileEditCompleter = new QCompleter(mdl, this);
fileEditCompleter->setCaseSensitivity(Qt::CaseInsensitive);
fileEditCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
ui->lineEdit->setCompleter(fileEditCompleter);
Run Code Online (Sandbox Code Playgroud)

当您想要更改数据时,例如,用户单击按钮或其他内容,您可以执行以下操作:

QDir dir("G:/2/tmp");
mdl->setStringList(dir.entryList(QStringList(), QDir::Files));
Run Code Online (Sandbox Code Playgroud)

现在您的完成者有了新数据。