2016-11-01 14 views
0

Qt-5.7.0を使用して、タイムアウト値を設定するQSpinBoxが必要です。値は秒または分で指定できます。 QLabelをSpinBoxの後ろに置いて、それがどれであるかを言います。ウィジェットでQKeyEventsを取得するにはどうすればよいですか?

ユーザーがコントロールを操作しているときに、Shiftキーを押したかどうかによって秒から分に変更したいと思います。したがって、例えば、カーソルがスピンボックス上にあるがシフトがない場合、ラベルはMinutesと表示され、スピンボックス番号は増分または減分することができます。

しかし、カーソルがスピンボックスの上にあり、シフトが押されると、ラベルはSecondsに切り替わり、スピンボックスの値はprevious_value * 60に変わり、値を変更することができます。

QtCreatorを使用してQSpinBoxとQLabelをQFrameに配置したので、すべてが適切な場所にまとめられていますが、シフト状態を取得できるスロットはありません。私はスピンボックスon_SB_valueChanged()機能でshiftをチェックすることができますが、値が変更されたときだけでなく、シフトボタンが押されたときに、が押されたときに、が実際に起こるようにしたいと思います。

標準的な管理方法はありますか? (私はそれを行うカスタムウィジェットを作ることができると思いますが、もっと簡単な方法がありますか?)そのようなカスタムウィジェットはどのようにしてQtCreatorに配置できますか?

+0

スピンボックスは接頭辞と接尾辞をサポートしているので、ラベルは必要ありません。 –

+0

これは最適な解決方法です:0〜10分のスピンボックスですが、1分未満になると、0〜60秒のスピンボックスに切り替えられ、現在の値は59に設定されます。 –

+0

サフィックスを自由に変更できますちょうどあなたがラベル上のテキストを行うのと同じように:) –

答えて

1

あなたはuse an event filterとすることができ、ウィジェットを拡張するのではなくイベントをインターセプトするために株ウィジェットにアタッチすることができます。

class Filter : public QObject { 
    Q_OBJECT 
    QLabel * l; 
    public: 
    Filter(QLabel * ll) : l(ll) {} 
    bool eventFilter(QObject *, QEvent *e) { 
     switch (e->type()) { 
     case QEvent::Wheel: 
     case QEvent::KeyPress: 
     case QEvent::KeyRelease: 
      if (QApplication::keyboardModifiers() & Qt::ShiftModifier) l->setText("shift"); 
      else l->setText("noshift"); 
     } 
     return false; 
    } 
}; 

class Widget : public QWidget { 
    Q_OBJECT 
    public: 
    Widget(QWidget *parent = 0) : QWidget(parent) { 
     auto ll = new QVBoxLayout(this); 
     setLayout(ll); 
     ll->addWidget(l = new QLabel(this)); 
     ll->addWidget(s = new QSpinBox(this)); 
     s->installEventFilter(new Filter(l)); 
    } 
    private: 
    QLabel * l; 
    QSpinBox * s; 
}; 
:私は個人的にはるかに直感的でエラーが発生しにくいであろうと、分、秒の間で切り替えるように小さなトグルボタンを持っていることを好むだろうが、ここで

は、そのべき多かれ少なかれ仕事いくつかのコードです

+0

ああ、それはかなりいいね。あなたのメソッドに適切な名前を付けることによって自動的に取得するのは簡単ではありませんが、追加するのは簡単です。私はそれを試してみましょう! –

+0

ハックではありません、それを行う公式と推奨された方法です。 – dtech

+0

スピンボックスからシフトを隠す方法はありますか?シフトキーが押されている間、マウスのスクロールでは増減しません。 (イベントフィルタなしの完全に別のスピンボックスでテストされます...シフトがダウンしている場合、マウススクロールは無視されます)。 –

関連する問題