我的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)
没有帮助...