2

我有QToolButton一个附件QMenu,其中包括几个QActions. 其中一项操作是按钮的默认操作。单击操作时,默认操作会动态更改,效果很好。

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

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

所以:当默认操作获得 a 时,我还能以某种方式使菜单可用setEnabled(false)吗?还是有其他一些想法?

4

3 回答 3

1

我做了以下操作来完全解决所描述的问题:

在我的QToolButton课堂上,我重写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);
}

并将以下行添加到构造函数:

installEventFilter(this);

尽管如此,还是感谢您的回答。但是,我没有检查它。

于 2014-08-14T11:22:52.677 回答
0

您可以天真地编写一个小函数,每当您禁用 a 时调用该函数,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);
  }
}

这将检查更改的操作是否是按钮的当前默认操作,如果是,则选择其中的下一个QAction作为QMenu新的默认操作(如果禁用的操作是列表中的最后一个操作,则选择第一个操作)。

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

这有什么帮助吗?

于 2014-08-13T18:46:56.530 回答
0

箭头被禁用的问题可以通过以下样式表来解决,它将标准箭头替换为位于 url 中的图像path_to_arrow当按钮被禁用时,此图像不会更改:

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

}

QToolButton::menu-arrow
{

    image: url("path_to_arrow");

}
于 2017-01-10T05:49:41.407 回答