2012-05-04 17 views
4

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

QCompleterにQAbstractItemModelを使用する必要がありますか?私はそれについて考えましたが、私はこのQAbstractItemModelを実際に理解していません。このようにメニューを作成した経験があれば、私も手伝ってください。

だから私は、ドロップダウンメニューの一般的なタイプを必要とする:行とメニューの誰もが自分自身のアイコン(QPixmapの)とテキスト(QLabel)が含まれています。アップルの右側の部分がスポットライトのようにそれがあったときにフォーカスをキャッチし、フォーカスを失ったときに非表示になりますので、それはQMenuでは不可能だなど、アドレス入力ラインにオペラやChromeブラウザのように

答えて

2

です。しかし、これにQListWidget(または他の通常のウィジェット)を使用することは可能です。私は概念実証のためのいくつかの実例を開発しました。 QMainWindowをメインウィンドウとするデフォルトのQtウィジェットプロジェクトです。名前が"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(); 
} 

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

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であなたの考えは面白いですが、私はそれを試してみましたが、それが適切ではありません。ありがとうございました。 –

関連する問題