5

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

或者也许我应该为 QCompleter 使用 QAbstractItemModel?我考虑过,但我不是很了解这个 QAbstractItemModel。如果您有以这种方式创建菜单的经验,也请帮助我。

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

4

2 回答 2

2

QMenu 不可能,因为它在显示时捕捉焦点,在失去焦点时隐藏。但是,可以为此使用 QListWidget(或任何其他常规小部件)。我为概念验证开发了一些工作示例。它是以 QMainWindow 作为主窗口的默认 Qt Widget 项目。您需要在其中添加带有名称的 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;
};

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

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

于 2012-05-04T16:23:16.473 回答
2

根据您的描述,您可以尝试一个可编辑的QComboBox:它有自己的模型和视图,自己的完成者,并且可以显示图标。

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

而且由于它可以显示图标,我想您可以使用带有QCompletera 的常规和带有图标的模型。对于模型,您可以使用.QLineEditQCompleterQStandardItemModel

于 2012-05-04T22:09:12.510 回答