2013-04-18 122 views
3

我想設置一個QComboBox一些自定義文本的文本設置顯示文本(也就是沒有在QComboBox的列表),而無需添加這個文本爲QComboBox的項目。 此行爲在可編輯的QComboBox上可以實現,其編號爲QComboBox::setEditText(const QString & text)。 但是,在不可編輯的QComboBox上,此函數不執行任何操作。的Qt - 不可編輯的QComboBox

是否有可能以編程方式設置一個不可編輯的QComboBox的顯示/編輯文本的東西,是不是在它的名單? 還是我必須找到另一種方式(例如使用QPushButton有一個彈出式菜單)

編輯:考慮與InsertPolicyQComboBox::NoInsert可編輯QComboBox。如果用戶鍵入內容並點擊輸入,則輸入的值將被使用但不會添加到列表中。我想要的是這種行爲以編程方式更改「當前」文本,但不允許用戶自己輸入一些文本。用戶可以從QComboBox中選擇一些東西,但是一段時間後,我可能想重寫'當前'文本。

+0

什麼是你想實現的,像工具提示?在可編輯的組合框中,它用於添加我猜想的一些不可預測的選項,但是如果不可編輯,爲什麼不將該工具提示文本添加爲​​具有零索引的項目,例如在添加項目之後,需要這些 – Shf

回答

0

我結束了使用QPushButton與彈出菜單。 我在菜單中將我在QComboBox列表中的項目添加爲QActions。 菜單可以在QPushButton

QPushButton::setMenu(QMenu* menu) 

進行設置。 按鈕上的文字可以很容易地

QPushButton::setText(const QString &) 

設置並無關,在彈出的菜單,這就是我想要的文字。

1

我假設你想要一個帶有「A」,「B」,「C」作爲實際數據和「這是A」的組合框,「這是B」和「這是c」顯示在QComboBox中。下面是代碼:

box.addItems(QStringList() << "This is A"<< "This is B"<< "This is C"); 
box.setItemData(0, "A"); 
box.setItemData(1, "B"); 
box.setItemData(2, "C"); 

你可以使用此代碼的實際數據:

QString actual = box.itemData(0).toString();//actual will be = "A"; 
qDebug()<<actual;//"A" 

注意:您可以設置幾乎要組合框項目的每一個數據類型。更重要的是,您可以爲第三個參數setItemData設置更多的每個項目的附加數據。

+1

這實際上並不是我想要的。我想要的是帶有3個選項(「A」,「B」,「C」)的QComboBox,顯示的文本可以是這三個選項之一或其他內容(「列表中沒有任何內容」)。這不應該是列表中的第四個選項。我想反覆改變這個東西的實際文字。 – PrisonMonkeys

2

我有同樣的問題,當我子類QComboBox做出的複選框組合框。我編寫了一個小函數以編程方式更改組合框中顯示的文本,但我不想讓用戶編輯該文本。解決的辦法是設置組合框中編輯:

this->setEditable(true); 

QComboBox::lineEdit()爲只讀。參考功能:

void CheckedComboBox::setText(QString text) 
{ 
    QLineEdit *displayedText = this->lineEdit(); 
    displayedText->setText(text); 
    displayedText->setReadOnly(true); 
} 
+0

謝謝,這個工程。這太糟糕了,由於'setEditable'(至少在Mac上它發生了變化),UI變化很大。 – PrisonMonkeys

1

重新實現的paintEvent:https://github.com/qt/qtbase/blob/28d1d19a526148845107b631612520a3524b402b/src/widgets/widgets/qcombobox.cpp#L2995

並添加以下行:opt.currentText = QString(tr("My Custom Text"));

實施例:

QCustomCheckComboBoxFilter。^ h

... 
protected: 
    void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE; 
... 

QCustomCheckComboBoxFilter.cpp

... 
void QCustomCheckComboBoxFilter::paintEvent(QPaintEvent *) 
{ 
    QStylePainter painter(this); 
    painter.setPen(palette().color(QPalette::Text)); 

    // draw the combobox frame, focusrect and selected etc. 
    QStyleOptionComboBox opt; 
    initStyleOption(&opt); 
    opt.currentText = QString(tr("My Custom Text")); 
    painter.drawComplexControl(QStyle::CC_ComboBox, opt); 

    // draw the icon and text 
    painter.drawControl(QStyle::CE_ComboBoxLabel, opt); 
} 
...