2016-08-12 1 views
2

In meiner Anwendung möchte ich einige Elemente in der QComboBox deaktivieren (d. H. Nicht auswählbar, keine Highlights, wenn die Maus darüber schwebt und die Texte ausgegraut sind), wenn bestimmte Bedingungen erfüllt sind.Deaktivieren bestimmter Elemente in QComboBox

Ich tatsächlich gefunden jemand hat die gleiche Frage hier gestellt: Disable Item in Qt Combobox Aber keine dieser Lösungen in den Antworten scheinen tatsächlich zu funktionieren (einschließlich der Trick).

Gibt es einen vernünftigen und "richtigen" Weg, dies zu implementieren?

EDIT:

Ich fand heraus, warum die Fahnen Einstellung würde die Einzelteile in meiner Anwendung nicht deaktivieren: aus irgendwelchen Gründen, ich den Stil QStyle::SH_ComboBox_UseNativePopup gesetzt hatte (siehe https://codereview.qt-project.org/#/c/82718/). Und diese Einstellung blockierte aus irgendwelchen Gründen die Flag-Einstellung. Hat jemand eine Idee warum und wie man arbeitet? Ein Minimum Testbeispiel enthalten ist (aus der Antwort von @ Mike modifiziert):

#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

haben Sie versucht [ dies] (http://stackoverflow.com/a/21740341/2666212) beantworten? Wenn Sie 'setModel' nicht in Ihrer' QComboBox' verwenden (dh wenn Sie Ihre Elemente mit 'addItem' hinzufügen), sollte dies für Sie funktionieren. – Mike

Antwort

7

Die oben in meinem Kommentar verknüpft Antwort scheint über eine alte Version von Qt zu sprechen. Ich getestet habe auf Qt5.4 und Qt5.6 und es gibt keine Notwendigkeit, die Farbe selbst hier eingestellt, Sie müssen nur eingestellt und/oder deaktivieren Sie die Qt::ItemIsEnabled Flagge, hier ein Beispiel:

#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

Beachten Sie, dass dies auf undokumentiertem Verhalten beruht, d. H. Das Unterstützungsmodell auf ein "QStandardItemModel" zu übertragen. Dies beinhaltet die gleichen Vorbehalte wie private Header. –

+0

Als Alternative erstellen Sie explizit eine 'QStandardItemModel'-Instanz, und setzen Sie sie zuerst auf das Kombinationsfeld. –

+0

@JonHarper, Nein, dies ist nicht undokumentiert, bitte lesen Sie [this] (https://doc.qt.io/qt-5/qcombobox.html#details). * QComboBox verwendet das Model/View-Framework für seine Popup-Liste und speichert seine Elemente. Standardmäßig speichert ein ** QStandardItemModel ** die Elemente und eine QListView-Unterklasse zeigt die Popupliste * an. – Mike

Verwandte Themen