14

編集する必要があるパラメーターのセットがあり、そのうちのいくつかは列挙型です。

今日の時点で、私は QSpinBox で列挙型の生の値を使用していますが、これはまったく友好的ではありません。自分で値を覚えて、適切なものを設定する必要があります。

私のパラメータエディタ

たとえば、E_Range は次のようなコンボ ボックスを表示できます。

typedef enum {
    ERANGE_2_5  = 0, /*!< +/- 2.5 V */
    ERANGE_5    = 1, /*!< +/- 5 V */
    ERANGE_10   = 2, /*!< +/- 10 V */
    ERANGE_AUTO = 3  /*!< Auto range */
} TVoltageRange_e;

QComboBox で列挙型を使用することについては何も見つかりませんでした。出来ますか?
はいの場合、手順は何ですか?

つまり、Qtメタオブジェクトで「列挙可能」になるように、Qtを介して列挙型を宣言する必要があると思います。しかし、そこから、私は確信が持てません。

4

2 に答える 2

12

もちろん、いつでも値をハードコーディングできますが、その列挙型を変更するとすぐに、コンボボックスに入力するコードを変更することを覚えておく必要があります。

つまり、Qtメタオブジェクトで「列挙可能」になるように、Qtを介して列挙型を宣言する必要があると思います。しかし、そこから、私は確信が持てません。

まさに、イントロスペクションを使用するのは賢明な方法です。列挙型をマークし、マクロQ_ENUMSを追加します。Q_OBJECTそれで:

  • クラスのメタオブジェクトを取得しますClass::staticMetaObject()
  • +QMetaEnumを介して列挙型の を取得しますQMetaObject::indexOfEnumerator()QMetaObject::enumerator()
  • を介してキーの数をQMetaEnum::keyCount()取得し、キー名とそれに対応する値を取得することを繰り返します ( QMetaEnum::key()QMetaEnum::keyToValue())。

これにより、プログラムでコンボボックスに入力できるようになります (典型的なパターンは、enum キーをユーザーに表示される文字列として追加し、対応する値を「項目データ」として追加することQComboBoxです。 のドキュメントを参照してください)。

于 2013-06-06T07:27:12.090 に答える
9

QMapを使用する別の方法:

を宣言しQMap<QString, QSomeObject::SomeEnum>て、コンボ ボックスに必要な列挙値を入力し、QComboBox に QMap のキーの QStringList を入力します。

最終的に、QMap の value() メソッドを QComboBox の currentText() メソッドと組み合わせて使用​​することにより、ユーザーが選択した列挙値を取得します。

QSerialPortクラスとQSerialPort::FlowControl enumの例:

QMap<QString, QSerialPort::FlowControl> *flowControlOptions = new QMap<QString, QSerialPort::FlowControl>;

flowControlOptions->insert("None",QSerialPort::NoFlowControl);
flowControlOptions->insert("Software",QSerialPort::SoftwareControl);
flowControlOptions->insert("Hardware",QSerialPort::HardwareControl);

QComboBox *flowControl = new QComboBox;

flowControl->addItems(QStringList(flowControlOptions->keys()));
flowControl->setCurrentIndex(2);

QSerialPort *sPort = new QSerialPort;

// Some code after... The user has selected an option

sPort->setFlowControl(flowControlOptions->value(flowControl->currentText()));
于 2015-03-02T16:05:02.863 に答える