2016-08-12 7 views
2

特定の条件が満たされたときに、QComboBoxで項目を無効にしたい(つまり、選択できない、マウスの上にマウスを置いたときにハイライトがない、テキストがグレー表示される)QComboBoxで特定の項目を無効にする

私は確かに誰かがここに同じ質問をするんでした:答えでDisable Item in Qt Combobox しかし、これらのソリューションのいずれもが、実際に(トリックを含む)が動作するように見えます。

これを実装するには適切かつ正しい方法がありますか?

EDIT:私のアプリケーション内の項目を無効にしないだろうフラグを設定する理由は、私が見つけた

:いくつかの理由のために、私はスタイルQStyle::SH_ComboBox_UseNativePopupを設定する必要がありました(https://codereview.qt-project.org/#/c/82718/を参照してください)。何らかの理由でこの設定がフラグ設定をブロックしました。なぜ誰かがアイデアを持ち、回避する方法はありますか? (@マイクの答えから変更)最小試験例含まれた:私のコメントにリンクされ

#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

あなたは試すんでした[ this](http://stackoverflow.com/a/21740341/2666212)答え?あなたの 'QComboBox'で' setModel'を使用していない場合(つまり、あなたが '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、いいえ、これは文書化されていませんので、[こちら](https://doc.qt.io/qt-5/qcombobox.html#details)をお読みください。 * QComboBoxはそのポップアップリストのためにモデル/ビューフレームワークを使用し、そのアイテムを格納します。デフォルトで** QStandardItemModel **はアイテムを格納し、QListViewサブクラスはpopuplist *を表示します。 – Mike

関連する問題