如何在qt mac application

时间:2016-08-29 14:46:09

标签: c++ macos qt

我的qt应用程序的菜单被禁用,只能通过黑客重新启用。

我有一个qt应用程序(带有QMainWindow的QApplication),具有不同的模式,每种模式都有自己的菜单。要在模式之间切换时更改菜单,我已将QMenuBar子类化并将QMenu指针集存储为成员。在模式之间切换时,我调用QMenuBar::clear(),然后遍历所有存储的菜单并调用QMenuBar::addMenu(QMenu*)

切换应用程序模式后,我的一些菜单项在GUI中被禁用,我无法与它们交互。但是,对于所有isEnabled()QMenu*项,QAction*都会返回true。

打开另一个模态窗口并再次关闭后,菜单项可用。为了以编程方式启用它们,我发现了这个丑陋的黑客:

ActivateMenu(QMenu* aMenu)
{
   QList<QAction*> vActions = aMenu->actions();
   for (bpSize vI = 0; vI < vActions.size(); ++vI) {
     QAction* vAction = vActions[vI];
     std::string vOldTitle = vAction->text().toStdString();
     std::string vNewTitle = "X" + vOldTitle;
     vAction->setText(vNewTitle.c_str());
     vAction->setText(vOldTitle.c_str());
   }
 }

QAction::setText(...)的来源是

void QAction::setText(const QString &text)
{
  Q_D(QAction);
  if (d->text == text)
    return;

  d->text = text;
  d->sendDataChanged();
}

我猜这是调用d->sendDataChanged(),它正在恢复我的操作项的正确状态。

不幸的是,我无法在玩具应用程序中重现这个问题。

这在windows上工作正常,我在mac上只有问题。我使用的是Qt 4.8.7 64位。

  • 这是一个已知问题/ QT错误(我首先认为它是this QT Bug,但错误示例程序在我安装的QT版本上运行良好)?

  • 存储QMenu *项目是否错误,我是否应该完全重建它们? QAction documentation表示:

  

当添加它的所有窗口小部件(使用QWidget :: addAction())被禁用或不可见时,将禁用该操作。禁用某个操作后,无法通过其快捷方式触发该操作。

我应该如何使用它们,但QMenu / QAction isEnabled()返回true,setEnabled(true)没有帮助...

  • 是否有更好的方法来纠正启用状态而不是我的黑客?

0 个答案:

没有答案