繁体   English   中英

为什么使用 QCompleter 自动完成的 QLineEdit 没有出现?

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

我在程序中有两个QLineEditlineEditfileName_Edit lineEdit保存目录的路径(取自用户)。 然后用户在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);
}

程序编译成功,但是完成程序没有出现。 即使我尝试将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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM