2016-08-12 6 views
2

В моем приложении я хочу отключить некоторые элементы (т. Е. Не выбираемые, без подсветки при наведении курсора мыши выше, а тексты выделены серым цветом) в QComboBox при выполнении определенных условий.Отключить определенные элементы в QComboBox

Я действительно нашел, что кто-то задал тот же вопрос здесь: Disable Item in Qt Combobox Но ни одно из этих решений в ответах не работает на самом деле (включая трюк).

Есть ли достойный и «правильный» способ реализовать это?

EDIT:

я узнал, почему установка флагов не будет отключать элементы в моем приложении: по некоторым причинам, я должен был установить стиль QStyle::SH_ComboBox_UseNativePopup (см https://codereview.qt-project.org/#/c/82718/). И эта настройка по некоторым причинам заблокировала установку флага. У кого-нибудь есть идея, почему и как работать? Минимальный пример теста входит (измененная из ответа @ Mike):

#include <QApplication> 
#include <QComboBox> 
#include <QStandardItemModel> 
#include <QProxyStyle> 

class ComboBoxStyle : public QProxyStyle 
{ 
public: 
    int styleHint (StyleHint hint, const QStyleOption * option = 0, const QWidget * widget = 0, QStyleHintReturn * returnData = 0) const override 
    { 
     if (hint == QStyle::SH_ComboBox_UseNativePopup) 
     { 
      return 1; 
     } 
     return QProxyStyle::styleHint(hint, option, widget, returnData); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QComboBox comboBox; 

    // Setting this style would block the flag settings later on. 
    comboBox.setStyle(new ComboBoxStyle()); 

    comboBox.insertItem(0, QObject::tr("item1")); 
    comboBox.insertItem(1, QObject::tr("item2")); 

    QStandardItemModel* model = qobject_cast<QStandardItemModel*>(comboBox.model()); 
    QStandardItem* item= model->item(1); 
    item->setFlags(item->flags() & ~Qt::ItemIsEnabled); 

    comboBox.show(); 
    return a.exec(); 
} 
+0

вы пытались [ это] (http://stackoverflow.com/a/21740341/2666212) ответ? если вы не используете 'setModel' в своем' QComboBox' (т. е. добавляете свои элементы с помощью 'addItem'), это должно сработать для вас. – Mike

ответ

7

Ответ связан с моим комментарием выше, кажется, говорить о старой версии Qt. Я испытал на Qt5.4 и Qt5.6 и нет необходимости устанавливать цвет себя здесь, вам просто нужно установить и/или очистить Qt::ItemIsEnabled флаг, вот пример:

#include <QApplication> 
#include <QComboBox> 
#include <QStandardItemModel> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QComboBox comboBox; 
    comboBox.addItem(QObject::tr("item1")); 
    comboBox.addItem(QObject::tr("item2")); 
    comboBox.addItem(QObject::tr("item3")); 
    QStandardItemModel* model = qobject_cast<QStandardItemModel*>(comboBox.model()); 
    bool disabled= true; 
    QStandardItem* item= model->item(2); 
    item->setFlags(disabled? item->flags() & ~Qt::ItemIsEnabled: 
          item->flags() | Qt::ItemIsEnabled); 
    comboBox.show(); 
    return a.exec(); 
} 
+0

Обратите внимание, что это зависит от недокументированного поведения, т. Е. Отбрасывания модели подстановки в 'QStandardItemModel'. Это связано с теми же предостережениями, что и частные заголовки. –

+0

В качестве альтернативы явным образом создайте экземпляр 'QStandardItemModel' и сначала установите его в поле со списком. –

+0

@JonHarper, Нет, это не недокументировано, пожалуйста, прочитайте [this] (https://doc.qt.io/qt-5/qcombobox.html#details). * QComboBox использует структуру модели/представления для своего всплывающего списка и для хранения своих элементов. По умолчанию ** QStandardItemModel ** хранит элементы, а подкласс QListView отображает popuplist *. – Mike

Смежные вопросы