5

QCompleter なしで QLineEdit からドロップダウン メニューを作成する標準的な方法はありますか? たとえば、QMenu を使用したり、独自のクラスを作成したりします。または、他の既存のウィジェットはありますか?

それとも、QCompleter に QAbstractItemModel を使用する必要がありますか? 考えてみましたが、この QAbstractItemModel がよくわかりません。この方法でメニューを作成した経験がある場合は、私も助けてください。

したがって、一般的なタイプのドロップダウン メニューが必要です。線のあるメニューで、そのすべてにアイコン (QPixmap) とテキスト (QLabel) が含まれています。Opera や Chrome ブラウザのアドレス入力行、Apple Spotlight の右側などに似ています。

4

2 に答える 2

2

表示されたときにフォーカスをキャッチし、フォーカスを失うと非表示になるため、QMenu では不可能です。ただし、これには QListWidget (またはその他の通常のウィジェット) を使用できます。概念実証のためにいくつかの実例を開発しました。QMainWindow をメイン ウィンドウとするデフォルトの Qt Widget プロジェクトです。名前付きの QLineEdit を追加し、 signa"lineEdit"用のスロットを作成する必要があります。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();
}

行編集がフォーカスを失ったときやユーザーがウィンドウを移動したときにメニューを非表示にする必要がある、行編集から下矢印ボタンを使用してメニューにフォーカスを設定できないなど、いくつかの問題がありますが、これらの問題はすべて簡単に解決できると思います。

于 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);

アイコンを表示できるので、レギュラーはアイコン付き、モデルはアイコン付きでQCompleter使えると思います。モデルには、 を使用できます。QLineEditQCompleterQStandardItemModel

于 2012-05-04T22:09:12.510 に答える