为禁用的QToolButton启用QMenu访问

为禁用的QToolButton启用QMenu访问,qt,qtgui,qmenu,qaction,Qt,Qtgui,Qmenu,Qaction,我有一个QToolButton,附带了一个QMenu,其中包括两个QActions。 其中一个操作是按钮的默认操作。默认操作在单击操作时会动态更改,这非常有效 现在,这些QActions被信号启用和禁用。当(当前)默认操作被禁用时,QToolButton也被禁用 这导致无法访问的QMenu,其中仍然包含我希望能够选择的已启用的QMenu条目(QActions) 因此:当默认操作获得setEnabled(false)时,我能否以某种方式使菜单可用?或者还有其他想法吗?天真地说,您可以编写一个小函数

我有一个
QToolButton
,附带了一个
QMenu
,其中包括两个
QActions
。 其中一个操作是按钮的默认操作。默认操作在单击操作时会动态更改,这非常有效

现在,这些
QActions
被信号启用和禁用。当(当前)默认操作被禁用时,
QToolButton
也被禁用

这导致无法访问的
QMenu
,其中仍然包含我希望能够选择的已启用的
QMenu
条目(
QActions


因此:当默认操作获得
setEnabled(false)
时,我能否以某种方式使菜单可用?或者还有其他想法吗?

天真地说,您可以编写一个小函数,在禁用
QAction
时调用该函数,看看它是否是当前的默认操作,如下所示:

void MyDialog::on_button_clicked()
{
  action2->setEnabled( false );
  checkForDefault(action2);
}

void MyDialog::checkForDefault(QAction *action)
{
  if ( tButton->defaultAction() == action ) {
    QList<QAction*> list = tButton->menu()->actions();
    int index = list.indexOf(action);
    QAction *newDefault = list.at( ( index+1 ) % list.count() );
    tButton->setDefaultAction(newDefault);
    tButton->setEnabled(true);
  }
}
void MyDialog::点击按钮()
{
action2->setEnabled(false);
检查默认值(操作2);
}
void MyDialog::checkForDefault(QAction*操作)
{
如果(tButton->defaultAction()==操作){
QList list=tButton->menu()->actions();
int index=list.indexOf(操作);
QAction*newDefault=list.at((索引+1)%list.count());
t按钮->设置默认操作(新默认);
t按钮->设置启用(真);
}
}
这将检查更改的操作是否为按钮的当前默认操作,如果是,将选择
QMenu
中的下一个
QAction
作为新的默认操作(如果禁用的操作是列表中的最后一个,则选择第一个操作)

另一种方法可能是让您自己的类继承自
QToolButton
,并重载其
actionEvent(QActionEvent*event)
方法来执行您需要的操作


这有什么帮助吗?

我做了以下操作来准确地解决所述问题:

在我的
QToolButton
class I中,覆盖
eventFilter
,如下所示:

bool MultiToolButton::eventFilter( QObject* inObject, QEvent* inEvent )
{
  MultiToolButton* _multiToolButton = 
    dynamic_cast<MultiToolButton*>(inObject);
  QMouseEvent* _mouseEvent = dynamic_cast<QMouseEvent*>(inEvent); 

  if(_multiToolButton 
    && _mouseEvent && _mouseEvent->type() == QEvent::MouseButtonPress)
  {
    mMenu.setEnabled(true);
    showMenu();
    return true;
  }

  return QToolButton::eventFilter(inObject, inEvent);
}

谢谢你的回答。但是,我没有检查它。

箭头被禁用的问题可以通过以下样式表解决,该样式表将标准箭头替换为位于url
path\u to\u arrow
中的图像。当按钮被禁用时,此图像不会改变:

QToolButton::menu-indicator,::menu-button 
{

}

QToolButton::menu-arrow
{

    image: url("path_to_arrow");

}

我使用了这个解决方案的一个变体(谢谢!)。是否有办法正确绘制菜单箭头(启用而不是禁用)?
QToolButton::menu-indicator,::menu-button 
{

}

QToolButton::menu-arrow
{

    image: url("path_to_arrow");

}