2013-03-02 9 views
5

Ich schreibe eine qt-basierte C++ - Anwendung. Ich habe eine Reihe von Tasten, die ich gegenseitig ausschließen möchte - nur eine kann auf einmal umgeschaltet werden. In der Regel verwende ich dafür eine QButtonGroup - es bietet eine nette logische Möglichkeit zum Verwalten von Tastengruppen. Wenn man gedrückt wird, wird die zuvor gedrückte gedrückt, was genau das Verhalten ist, das ich möchte.Alternative zu QButtonGroup, die keine Auswahl erlaubt?

Diesmal möchte ich jedoch zulassen, dass die Gruppe vollständig deaktiviert wird. Leider scheint dies durch QButtonGroup nicht anerkannt werden:

exklusiv: bool

Diese Eigenschaft enthält, ob die Schaltfläche Gruppe exklusiv ist.

Wenn diese Eigenschaft wahr ist, kann nur eine Schaltfläche in der Gruppe jederzeit überprüft werden. Der Benutzer kann auf eine beliebige Schaltfläche klicken, um es zu überprüfen, und diese Schaltfläche wird die vorhandene als die überprüfte Schaltfläche in der Gruppe ersetzen.

In einer exklusiven Gruppe, , kann der Benutzer die derzeit überprüfte Schaltfläche nicht deaktivieren, indem er darauf klickt; stattdessen muss eine andere Schaltfläche in der Gruppe geklickt werden, um die neue überprüfte Schaltfläche für diese Gruppe festzulegen.

Es gibt natürlich eine Reihe von Möglichkeiten, dies zu umgehen. Ich frage mich, ob es eine vorgefertigte Alternative zu QButtonGroup gibt, die dieses Verhalten erlaubt, so dass 1) ich das Rad nicht neu erfinde und 2) ich innerhalb von idiomatic qt bleiben kann, um die Projektverwaltung in der Zukunft zu erleichtern.

Irgendwelche Vorschläge?

+2

AFAIK Nö.Besonders in diesem Fall ist Code erforderlich, um Ihre Funktionalität zu erhalten ist sehr minimal. Deaktivieren Sie die exklusive Eigenschaft nur aus der Schaltflächengruppe, wenn Sie alle in einem Ereignisfilter/Mausklick-Ereignis deaktiviert haben möchten und das Senderobjekt mit der aktuell gedrückten Schaltfläche identisch ist. Andernfalls schalten Sie die exklusive Eigenschaft ein, wenn sie noch nicht aktiviert ist. – Viv

+0

Drei Jahre später, aber ich habe heute festgestellt, dass wenn ich Autoexclusive anstelle von QButtonGroup und Qt 4.8.6 benutze, bin ich in der Lage, den ausgewählten Radiobutton abzuwählen. Nicht sicher, ob dies ein Fehler ist oder nicht. – Phlucious

Antwort

1

Der Vollständigkeit halber möchte ich hier eine mögliche Lösung für das Problem veröffentlichen, da ich es gerade in meinem Fall gelöst habe. Beachten Sie jedoch, dass der folgende Code für Qt3 gültig ist. Es kann auch für Qt4 und Qt5 funktionieren, da es nicht viel verwendet.

Also nehme ich an, dass ich irgendwo ein Widget CustomWidget habe, das Buttons (vom Typ CustomButton) enthält und dass man nur eine Taste anschalten kann. Klickt man im Widget auf eine andere Schaltfläche, wird die aktuell eingeschaltete Schaltfläche ausgeschaltet und die neu angeklickte Schaltfläche wird eingeschaltet.

Die CustomButtons im CustomWidget enthalten sind alle in einem QButtonGroup in der folgenden Art und Weise enthalten:

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); 

Hier btn1, Btn2 und Btn3 vom Typ sind 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); 
}; 

Die Methode Möchten Sie speziell implementieren, ist mousePressEvent. Wenn sein Körper auf die folgende Art und Weise durchgeführt wird:

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); 
} 

dann verhält sich das Widget, wie Sie wollen.

1

In QT5, verwende ich eine ähnliche Lösung wie Laurent Michel, aber die Freigabe Ereignis statt der Presseveranstaltung mit:

// 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); 
} 
Verwandte Themen