2013-03-02 7 views
5

私はqtベースのC++アプリケーションを作成しています。私は相互に排他的であることを望む多数のボタンを持っています - 一度に1つだけ切り替えます。私は一般的にこれにQButtonGroupを使用しています。それは、ボタンのセットを管理するための素晴らしい論理的方法を提供します。 1つが押されると、以前押されたものは押されなくなります。これはまさに私が望むふるまいです。選択を許可しないQButtonGroupの代わりに?

今回は、グループ全体が完全にチェックされないようにしたいと思います。残念ながら、これはQButtonGroupで禁止されているようだ:

排他:BOOL

このプロパティは、ボタングループが排他的であるかどうかを保持しています。

このプロパティがtrueの場合、グループ内の1つのボタンのみが任意の時点で にチェックされます。ユーザは任意のボタンをクリックして をチェックすることができ、そのボタンは既存のものをグループ内のチェックされた ボタンと置き換える。

排他的グループのユーザは、現在チェックされている ボタンをクリックして選択を解除することはできません。の代わりに、グループ内の別のボタンを にする必要があります。

もちろん、これを回避する方法はいくつかあります。私は車輪を再発明していない、2)私は慣用的なqtの中にいれば、将来のプロジェクト管理を容易にすることができるように、この動作を可能にするQButtonGroupの既製の代替品があるかどうか疑問に思っています。

提案がありますか?

+2

いや私の知る限り。特にこの場合、機能を取得するために必要なコードはごくわずかです。ボタングループの排他的なプロパティをオフにするだけで、イベントフィルタ/マウスの押下イベントではすべて選択解除され、送信者オブジェクトは現在の押下ボタンと同じになります。そうでない場合は、排他的なプロパティをオンにします。 – Viv

+0

3年後、私は今日、QButtonGroupとQt 4.8.6の代わりに自動排他を使用すると、選択したラジオボタンの選択を解除できることに気付きました。これがバグかどうかは不明です。 – Phlucious

答えて

1

完全性のために、ここで私のケースで解決したので、ここでは問題の解決策を1つ公開したいと思います。次のコードがQt3に有効であることに注意してください。それはQt4とQt5でもうまくいくかもしれませんが、それはたくさんのものを使用しないからです。

私はウィジェットCustomWidgetのどこかに(CustomButtonタイプの)ボタンを含み、唯一のボタンをオンにできると仮定します。ウィジェット内の別のボタンをクリックすると、現在スイッチされているボタンがオフになり、新たにクリックされたボタンがオンになります。 CustomWidgetに含まれる

CustomButtonsはすべて、次のようにQButtonGroupに含まれています。

ここ
QButtonGroup* m_ButtonGroup = new QButtonGroup(this); 
m_ButtonGroup->hide(); 
m_ButtonGroup->insert(Btn1); 
m_ButtonGroup->insert(Btn2); 
m_ButtonGroup->insert(Btn3); 
m_ButtonGroup->setExclusive(true); 

、BTN1、BTN2、およびBtn3はCustomButton

class CustomButton : public QToolButton 
{ 
    Q_OBJECT 

    public: 
    CustomButton (QWidget* apo_parent = 0, const char* as_name = 0); 
    virtual ~CustomButton(); 

    protected: 
    virtual void mousePressEvent(QMouseEvent* a_Event); 
}; 

方法あなたのタイプであります特別に実装したいのはmousePressEventです。その本体が次のように実装されている場合:

void CustomButton ::mousePressEvent(QMouseEvent* a_Event) 
{ 
    if(group() && isToggleButton()) 
    { 
    CustomButton* selectedButton(dynamic_cast<CustomButton*>(group()->selected())); 
    if(selectedButton) 
    { 
     if(selectedButton->name() == name()) 
     { 
     group()->setExclusive(false); 
     toggle(); 
     group()->setExclusive(true); 
     return; 
     } 
    } 
    } 
    QToolButton::mousePressEvent(a_Event); 
} 

ウィジェットは、必要に応じて動作します。 Qt5で

1

、私はローラン・ミシェルさんと同様のソリューションを使用するが、代わりにプレスイベントのリリースイベントを使用して:

// Allow to uncheck button in exclusive group 
void CustomButton::mouseReleaseEvent(QMouseEvent* a_Event) { 
    if(group()->checkedId()==group()->id(this)) { 
     if(isDown()) group()->setExclusive(false); 
    } 
    QToolButton::mouseReleaseEvent(a_Event); 
    group()->setExclusive(true); 
}