我正在编写一个qt基于c ++的应用程序.我有一些我希望互相排斥的按钮 - 一次只能切换一个按钮.我通常使用QButtonGroup - 它提供了一种很好的逻辑方式来管理按钮组.当一个人被按下时,先前按下的一个被压下,这正是我想要的行为.
但是,这一次,我想允许该组完全不受控制.不幸的是,这似乎是不允许的QButtonGroup:
独家:布尔
此属性保存按钮组是否为独占.
如果此属性为true,则在任何给定时间只能检查组中的一个按钮.用户可以单击任何按钮进行检查,该按钮将替换现有按钮作为组中的选中按钮.
在专用组中,用户无法通过单击取消选中当前选中的按钮; 相反,必须单击组中的另一个按钮才能为该组设置新的选中按钮.
当然,有很多方法可以解决这个问题.我想知道是否有预制替代方案QButtonGroup允许这种行为,以便1)我不是重新发明轮子和2)我可以保持在惯用之中qt,以便将来更轻松地进行项目管理.
有什么建议?
为了完整起见,我想在这里发布该问题的一种可能的解决方案,因为我刚刚在我的案例中解决了这个问题。请注意,以下代码对 Qt3 有效。它也适用于 Qt4 和 Qt5,因为它没有使用很多东西。
因此,我假设我在某处有一个小部件 CustomWidget,其中包含按钮(类型为 CustomButton),并且只有一个按钮可以打开。如果单击小部件中的另一个按钮,则当前打开的按钮将关闭,新单击的按钮将打开。
CustomWidget 中包含的 CustomButton 全部包含在 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);
Run Code Online (Sandbox Code Playgroud)
这里,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);
};
Run Code Online (Sandbox Code Playgroud)
您要专门实现的方法是 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);
}
Run Code Online (Sandbox Code Playgroud)
然后小部件就会按照您想要的方式运行。
| 归档时间: |
|
| 查看次数: |
2145 次 |
| 最近记录: |