有没有标准方法可以在没有QCompleter的情况下从QLineEdit创建下拉菜单?例如,使用QMenu或创建自己的类。或者还有其他现有的小部件?
或许我应该将QAbstractItemModel用于QCompleter?我已经考虑过了,但我真的不明白这个QAbstractItemModel。如果您有以这种方式创建菜单的经验,请帮助我。
所以我需要一个常见类型的下拉菜单:带有线条的菜单,其中每个都包含图标(QPixmap)和文本(QLabel)本身。就像在Opera或Chrome浏览器中的地址输入行一样,就像Apple Spotlight等的正确部分一样。
答案 0 :(得分:2)
使用QMenu是不可能的,因为它在显示时会抓住焦点,在失去焦点时会隐藏。但是,可以使用QListWidget(或任何其他常规小部件)。我为概念证明开发了一些工作示例。它是QMainWindow作为主窗口的默认Qt Widget项目。您需要将名称为"lineEdit"
的QLineEdit添加到其中,并为textChanged
signa创建插槽。这是代码:
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();
}
有几个问题:你应该在行编辑失去焦点或用户移动窗口时隐藏菜单,你不能使用行编辑中的向下箭头按钮等设置菜单焦点。但我相信所有这些问题都可以解决容易。
答案 1 :(得分:2)
根据您的描述,您可以尝试使用可编辑的QComboBox
:它有自己的模型和视图,它自己的完成者,并且可以显示图标。
QComboBox *comboBox = new QComboBox;
...
comboBox->setEditable(true);
// The completer popup isn't enabled by default
comboBox->completer()->setCompletionMode(QCompleter::PopupCompletion);
由于QCompleter
可以显示图标,因此我猜您可以使用带有QLineEdit
的常规QCompleter
和带图标的模型。对于模型,您可以使用QStandardItemModel
。