Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在qt mac应用程序中重新启用禁用的菜单项_C++_Macos_Qt - Fatal编程技术网

C++ 如何在qt mac应用程序中重新启用禁用的菜单项

C++ 如何在qt mac应用程序中重新启用禁用的菜单项,c++,macos,qt,C++,Macos,Qt,我的qt应用程序的菜单被禁用,只能通过破解重新启用 我有一个qt应用程序(QApplication with QMainWindow),具有不同的模式,每个模式都有自己的菜单。为了在模式之间切换时更改菜单,我将QMenuBar子类化,并将QMenu指针集存储为成员。在模式之间切换时,我调用QMenuBar::clear(),然后遍历所有存储的菜单并调用QMenuBar::addMenu(QMenu*) 切换应用程序模式后,GUI中的一些菜单项被禁用,我无法与它们交互。但是,isEnabled()

我的qt应用程序的菜单被禁用,只能通过破解重新启用

我有一个qt应用程序(QApplication with QMainWindow),具有不同的模式,每个模式都有自己的菜单。为了在模式之间切换时更改菜单,我将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());
   }
 }
我猜是调用
d->sendDataChanged()
恢复了操作项的正确状态

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

这在windows上运行良好,我只在mac上有问题。我使用的是Qt4.8.7 64位

  • 这是一个已知的问题/QT错误(我最初认为是,但错误示例程序在我安装的QT版本中运行良好)

  • 存储QMenu*项有错吗?我应该完全重建它们吗?缔约国指出:

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

我应该是这样使用它们的,但是QMenu/QAction
isEnabled()
返回true,并且
setEnabled(true)
没有帮助

  • 有没有比我的hack更好的方法来纠正启用状态
void QAction::setText(const QString &text)
{
  Q_D(QAction);
  if (d->text == text)
    return;

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