C++ 如何在qt mac应用程序中重新启用禁用的菜单项
我的qt应用程序的菜单被禁用,只能通过破解重新启用 我有一个qt应用程序(QApplication with QMainWindow),具有不同的模式,每个模式都有自己的菜单。为了在模式之间切换时更改菜单,我将QMenuBar子类化,并将QMenu指针集存储为成员。在模式之间切换时,我调用C++ 如何在qt mac应用程序中重新启用禁用的菜单项,c++,macos,qt,C++,Macos,Qt,我的qt应用程序的菜单被禁用,只能通过破解重新启用 我有一个qt应用程序(QApplication with QMainWindow),具有不同的模式,每个模式都有自己的菜单。为了在模式之间切换时更改菜单,我将QMenuBar子类化,并将QMenu指针集存储为成员。在模式之间切换时,我调用QMenuBar::clear(),然后遍历所有存储的菜单并调用QMenuBar::addMenu(QMenu*) 切换应用程序模式后,GUI中的一些菜单项被禁用,我无法与它们交互。但是,isEnabled()
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*项有错吗?我应该完全重建它们吗?缔约国指出:
isEnabled()
返回true,并且setEnabled(true)
没有帮助
- 有没有比我的hack更好的方法来纠正启用状态
void QAction::setText(const QString &text)
{
Q_D(QAction);
if (d->text == text)
return;
d->text = text;
d->sendDataChanged();
}