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

时间:2014-09-26 13:19:54

标签: c++ qt autocomplete

我在该计划中有两个QLineEditlineEditfileName_EditlineEdit保存目录的路径(取自用户)。然后用户在fileName_Edit中输入文件名。我想在fileName_Edit输入文件名时向用户显示建议。我试图像这样实施QCompleter
dirContentsQStringList,其中包含用户在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);
}

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

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

编辑:添加以上行会出错:

  

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

根据要求将评论转换为答案......

在向用户提供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
}

答案 1 :(得分:2)

尝试简单地编写代码,如果下一个代码适合您,那么一切正常并开始改进它。

在构造函数中:

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

如果这可以在您的计算机上运行,​​那么您将确保您的系统和项目是好的,并开始改进它(更改列表等)。并尝试不要使用全局变量。

如果你想动态地做。创建简单模型,当您将新的stringList设置为它时,您的完成者始终可以显示新数据

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

现在您的完成者有新数据