为什么QLineEdit with QCompleter自动完成没有显示?

Why QLineEdit with QCompleter for auto completion doesn't shows up?

本文关键字:显示 QLineEdit with QCompleter 为什么      更新时间:2023-10-16

程序中有两个QLineEdit,分别是lineEditfileName_EditlineEdit保存一个目录的路径(取自用户)。然后用户在fileName_Edit中输入文件名。当用户在fileName_Edit中输入文件名时,我想向他显示建议。我尝试这样实现QCompleter
dirContents是保存用户在lineEdit中指定的目录的内容的QStringList

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);
}

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

QObject::connect(&MainWindow::ui->lineEdit, SIGNAL(&textChanged(QString)), this,SLOT(&MainWindow::on_lineEdit_editingFinished())); 

编辑:添加上面的行给出一个错误:

在(标记)之前需要构造函数、析构函数或类型转换

任何帮助都将不胜感激。

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

在构造函数中:

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);

如果这能在你的电脑上运行,那么你可以确保你的系统和项目是好的,并开始改进它(更改列表等)。尽量不要使用全局变量。

如果你想动态地进行,创建一个简单的模型,当你将新的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);

当你想更改数据时,例如,用户点击按钮或其他什么,你可以做:

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

现在您的完井工有了新数据。

根据请求将注释转换为答案。。。

在向用户提供QLineEdit之前,请尝试设置完成符。例如,在MainWindow的构造函数中。将其设置在textChanged插槽中是不正确的。

MainWindow::MainWindow()
  : QWidget(nullptr)
  , ui( new ui_MainWindow() )
{
  ui->setupUi(this);
  //...
  QCompleter *fileEditCompleter = new QCompleter(dirContents, this);
  fileEditCompleter->setCaseSensitivity(Qt::CaseInsensitive);
  fileEditCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
  ui->fileName_Edit->setCompleter(fileEditCompleter);
}
void MainWindow::on_lineEdit_textChanged(const QString &arg1)
{
  // Do nothing here
}