为了完整起见,我想在这里发布一个可能的问题解决方案,因为我只是在我的案例中解决了它。请注意,以下代码对 Qt3 有效。它也适用于 Qt4 和 Qt5,因为它不使用很多东西。
所以,我假设我在某处有一个包含按钮(CustomButton 类型)的小部件 CustomWidget,并且只有一个按钮可以打开。如果单击小部件中的另一个按钮,则当前打开的按钮将关闭,而新单击的按钮将打开。
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);
}
然后小部件的行为如你所愿。