【问题标题】:How to stop graying out of main window menu after activation of child window?激活子窗口后如何停止主窗口菜单变灰?
【发布时间】:2016-11-08 07:24:15
【问题描述】:

Windows有一个特点:如果当前窗口没有被激活,这个窗口的主菜单看起来是被禁用的(但实际上它只是变灰了,所以你可以点击这个菜单中的任何项目)。切换到别的程序没问题,但是到子窗口就不行了。

即使使用标准记事本也很容易重现这种效果:

  • 在里面放任何文字,
  • Ctrl+F,
  • 现在您可以看到主菜单看起来已禁用,但您可以单击其中的任何项目。

问题如下:如何仅为我的程序阻止此效果?在我的程序(C++ 和 Qt)中,当用户转到子窗口。有没有办法阻止它?

我没有在这里放任何代码,因为这种效果在大多数程序中都可以重现。但我希望可以更改我的QMenuQMenuBar 的标志/属性以纠正这种行为。有可能吗?

【问题讨论】:

  • 实际发生的情况是,当一个窗口没有输入焦点时,它的菜单被绘制成灰色,就好像它被禁用了一样。如果不将输入焦点设置到窗口,就无法调用菜单。当您单击菜单项时,它会将输入焦点设置到窗口(将焦点从弹出对话框中移开),这就是菜单项再次被绘制为启用的原因。如果您单击一个菜单项,然后按两次 Esc 以关闭该菜单,您会发现包含该菜单的窗口仍然保持焦点。所以你所做的就是通过点击改变焦点!
  • 对于内置菜单支持的工作方式,您无能为力。这不是不合适的,当您使用键盘选择菜单项时,它们将不起作用。按 Alt 键不显示提示,并且 Alt+F 不选择文件。无模式对话框通常是一个令人头疼的可用性问题。
  • @HansPassant 是的,谢谢,我完全同意当 Alt 键不起作用时(即当此菜单处于非活动状态时)将菜单显示为活动状态很奇怪。但这是客户需要的。有时我们不得不做这样的事情。

标签: c++ windows qt user-interface menu


【解决方案1】:

我们可以更正QMenuBar 的调色板,将处于非活动状态的文本颜色替换为处于活动状态的文本颜色。

代码:

QPalette pal = pMenuBar->palette();
QColor col = pal.color(QPalette::Active, QPalette::ButtonText);
pal.setColor(QPalette::Inactive, QPalette::ButtonText, col);
pMenuBar->setPalette(pal);

之后用户将不会看到主菜单中的项目变灰,因为活动项目和非活动项目的文本颜色将相同。

(理论上同一个item的活动状态和非活动状态的背景颜色可能是不同的,所以也可以对背景进行相同的替换)

【讨论】:

  • 我想问一下,如果你不使用调色板颜色模式(你肯定不会),这怎么可能工作。但后来我查看了 QPalette 的文档,发现这是一些特定于 Qt 的废话。 “Qt 中的所有小部件都包含一个调色板,并使用它们的调色板来绘制自己。”是的,因为 Qt 中没有任何东西实际上是本机控件,这就是为什么库被破坏并且它产生的应用程序很糟糕的原因,以及为什么在使用 Qt 时询问有关 Windows 编程的建议有点废话。我从您的屏幕截图中假设您使用的是 Win32。
  • 另外,请记住,客户通常认为他们想要东西,但作为他们聘请的专家,你的工作是向他们解释为什么他们认为他们想要的东西不'没道理。 Hans 和我的 cmets 的目的是向您解释足够多,以便您可以向他们解释。有时程序员会混淆并认为完全按照客户的要求去做是他们唯一的工作。但我们不是训练有素的猴子。我们被雇用去思考和设计,因为我们知道自己在做什么。如果您向客户发送的东西令人困惑或无法使用,他们完全有权责备您。
  • @CodyGray 谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
相关资源
最近更新 更多