有没有标准的方法可以在不使用QCompleter的情况下从QLineEdit创建下拉菜单?

5
有没有标准的方法可以在不使用QCompleter的情况下从QLineEdit创建下拉菜单?例如,使用QMenu或创建自己的类。还是有其他现有的小部件吗?
或者我应该为QCompleter使用QAbstractItemModel?我考虑过这个问题,但我真的不太理解这个QAbstractItemModel。如果您有在此方式中创建菜单的经验,请也帮助我。
因此,我需要一种常见类型的下拉菜单:每个菜单都包括自己的图标(QPixmap)和文本(QLabel)。就像在Opera或Chrome浏览器的地址输入行中一样,就像Apple Spotlight的右侧等。
2个回答

2

由于QMenu在显示时会捕获焦点并在失去焦点时隐藏,因此无法实现。但是,可以使用QListWidget(或任何其他常规小部件)来实现。我已经为概念验证开发了一些工作示例。它是默认的Qt Widget项目,其中QMainWindow是主窗口。您需要添加一个名为"lineEdit"的QLineEdit,并为textChanged信号创建插槽。以下是代码:

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

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

有几个问题:当行编辑器失去焦点或用户移动窗口时,你应该隐藏菜单;你不能使用下箭头按钮从行编辑器设置菜单的焦点等。但我相信所有这些问题都可以轻松解决。


2

根据您的描述,您可以尝试使用可编辑的QComboBox:它有自己的模型和视图,自带自动完成功能,并且可以显示图标。

QComboBox *comboBox = new QComboBox;
...
comboBox->setEditable(true);
// The completer popup isn't enabled by default
comboBox->completer()->setCompletionMode(QCompleter::PopupCompletion);

因为 QCompleter 可以显示图标,所以我想你可以使用带有 QCompleter 和具有图标的模型的普通 QLineEdit。对于模型,您可以使用 QStandardItemModel


1
您使用 QComboBox 的想法很有趣,但我已经尝试过了,发现并不适合。谢谢。 - Ivan Akulov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接