没有QCompleter,可以从QLineEdit创建下拉菜单的任何标准方法吗?

Iva*_*lov 5 c++ qt menu input drop-down-menu

没有QCompleter,可以从QLineEdit创建下拉菜单的任何标准方法吗?例如,使用QMenu或创建自己的类。还是有其他现有的小部件?

还是我应该对QCompleter使用QAbstractItemModel?我已经考虑过了,但是我不太了解这个QAbstractItemModel。如果您有以这种方式创建菜单的经验,请也帮我。

因此,我需要一种常见的下拉菜单类型:带有行的菜单,其中每个行本身都包含图标(QPixmap)和文本(QLabel)。就像在Opera或Chrome浏览器中的地址输入行中一样,例如Apple Spotlight的右侧等。

Pav*_*hov 2

对于 QMenu 来说这是不可能的,因为它在显示时捕获焦点,在失去焦点时隐藏。但是,可以使用 QListWidget(或任何其他常规小部件)来实现此目的。我开发了一些用于概念验证的工作示例。它是默认的 Qt Widget 项目,以 QMainWindow 作为主窗口。您需要将带有名称的 QLineEdit 添加"lineEdit"到其中并为textChangedsigna 创建插槽。这是代码:

MainWindow.h:

class MainWindow : public QMainWindow {
  Q_OBJECT  
public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();  
private slots:
  void on_lineEdit_textChanged(const QString &arg1);
private:
  Ui::MainWindow *ui;
  QListWidget* list;
};
Run Code Online (Sandbox Code Playgroud)

MainWindow.cpp:

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow),
  list(new QListWidget)
{
  ui->setupUi(this);
  list->setWindowFlags(Qt::WindowFlags(
    Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint));
  list->setAttribute(Qt::WA_ShowWithoutActivating);
}

MainWindow::~MainWindow() {
  delete list;
  delete ui;
}

void MainWindow::on_lineEdit_textChanged(const QString &arg1) {
  if (ui->lineEdit->text().isEmpty()) {
    list->hide();
    return;
  }
  list->clear();
  list->addItem(ui->lineEdit->text());
  list->addItem(tr("Google: ") + ui->lineEdit->text());
  list->move(ui->lineEdit->mapToGlobal(QPoint(0, ui->lineEdit->height())));
  if (!list->isVisible()) list->show();
}
Run Code Online (Sandbox Code Playgroud)

有几个问题:当行编辑失去焦点或用户移动窗口时,您应该隐藏菜单,您无法使用行编辑中的向下箭头按钮将焦点设置在菜单上,等等。但我相信所有这些问题都可以轻松解决。