2017-04-11 84 views
0

我創建了一個可編輯QCombobox通過存儲最後輸入:變化下拉-位置

QComboBox* input = new QComboBox(); 
input->setEditable(true); 
input->completer()->setCompletionMode(QCompleter::PopupCompletion); 
input->setMaxCount(5); 

現在我得到了2個問題:

  1. 我想限制下拉的大小-menu到最後5個輸入字符串。

  2. 這5箇舊輸入應全部顯示在頂部的可編輯行。目前,舊的輸入會隱藏可編輯的行。

對於第一方面,調用「setMaxCount(5)」使得QComboBox顯示插入第一 5項,但我希望它顯示最後 5個項目。

對於第二個方面,我以某種方式需要改變我的想法。所以改變某事。像這些參數:

setStyleSheet("QComboBox::drop-down {\ 
       subcontrol-origin: padding;\ 
       subcontrol-position: bottom right;\ 
     }"); 

但我不知道哪裏參數來改變s.t.只有最後5個條目全部顯示在QComboBox的輸入行下。

編輯

下面是如何出現的下拉菜單兩張圖片。我進了5個條目,你可以看到,但編輯線得到由彈出隱伏: enter image description here

enter image description here

在第二個畫面,編輯行是正確的標記進入「5」後面。

回答

1

爲了只保留最後5個項目,您可以先聽取您的QComboBoxQLineEdit信號editingFinished()。發出信號時,您可以檢查項目計數並在計數爲6時刪除最舊的項目。

要重新定位下拉菜單,您必須子類QComboBox並重新實​​現showPopup()方法。從那裏你可以指定如何移動彈出菜單。

這裏是一個類,你可以簡單地粘貼到您的mainwindow.h:

#include <QComboBox> 
#include <QCompleter> 
#include <QLineEdit> 
#include <QWidget> 

class MyComboBox : public QComboBox 
{ 
    Q_OBJECT 

public: 
    explicit MyComboBox(QWidget *parent = 0) : QComboBox(parent){ 
     setEditable(true); 
     completer()->setCompletionMode(QCompleter::PopupCompletion); 
     connect(lineEdit(), SIGNAL(editingFinished()), this, SLOT(removeOldestRow())); 
    } 

    //On Windows this is not needed as long as the combobox is editable 
    //This is untested since I don't have Linux 
    void showPopup(){ 
     QComboBox::showPopup(); 
     QWidget *popup = this->findChild<QFrame*>(); 
     popup->move(popup->x(), popup->y()+popup->height()); 
    } 

private slots: 
    void removeOldestRow(){ 
     if(count() == 6) 
      removeItem(0); 
    } 
}; 

這兩者相結合的解決方案爲一類。只需添加到您的項目,然後改變你從這個QComboBox聲明:

QComboBox* input = new QComboBox(); 
input->setEditable(true); 
input->completer()->setCompletionMode(QCompleter::PopupCompletion); 
input->setMaxCount(5); 

這樣:

MyComboBox* input = new MyComboBox(); 

我在Windows上,所以我不能夠測試的準確結果下拉式重新定位,但我認爲它會起作用。請測試它,讓我知道它是否表現得如何。

+0

第一件事情效果很好:)我編輯了我的問題,以便您可以看到問題。彈出菜單打開到頂部隱藏編輯線。 – Kapa11

+1

@ Kapa11嗯,我在Windows上,所以它的行爲有所不同。由於我無法測試,因此我很難想出答案。請看我編輯的答案。 – mrg95

+0

非常好!所有我想要的。非常感謝:) – Kapa11