C++ Qt继承QMessageBox延迟用户输入以防止意外 Action

标签 c++ qt user-interface

问题

Windows 有一个系统设置,可以使鼠标指针自动跳转(移动)到新的焦点元素,例如弹出对话框的默认按钮。虽然优点是速度的提高和鼠标移动的减少,但它也有缺点:

如果这发生在用户点击另一个元素之前,用户无法及时中止他/她的操作并且将立即接受对话框默认按钮,因为焦点被系统移动了。通常这可能需要进行繁琐的工作来回溯到此为止的步骤(想想一个文件选择器对话框,它忘记了您之前输入的很长的路径),但它也可能意味着触发一个不可逆的过程(例如文件删除)。

瞄准

基本上我想在一小段时间内禁用对话框的输入,刚好足以防止无意中点击鼠标或按下键盘按钮。

问题

它归结为一个 C++ 问题,即如何从继承类访问基类的对象(GUI 小部件),即

  1. 禁用 QMessageBox 的按钮部件
  2. 启动一个单发 QTimer 并将其连接到一个插槽
  3. 启用之前禁用的小部件

(作为替代方案,我可能可以重新实现输入事件处理程序,在特定时间内抑制所有输入,但尽管我打算将该时间保持在很短的时间内(例如 100 毫秒),但用户不会被告知禁用输入使用那个方法。)

派生自 QDialogBox 的简单类可以在 http://www.qtforum.org/article/24342/messagebox-auto-close-mouse-event-close.html 找到。 .

最佳答案

您是否需要使用 QMessageBox 静态函数提供的“原生”消息框之一?

否则,这很容易实现,只需构建一个 QMessageBox 并向其添加标准按钮即可:

QMessageBox *messageBox = new QMessageBox;
QPushButton *okButton = messageBox->addButton(QMessageBox::Ok);
okButton->setEnabled(false);
// use a QTimer to add logic to reenable the button
// use QCursor to move the mouse cursor on the button 
// add a nice countdown in the button's label, like Firefox does
// add other nice UX touches as wanted

最后一点留给读者作为练习:)

关于C++ Qt继承QMessageBox延迟用户输入以防止意外 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17719578/

相关文章:

c++ - 捕获创建的异常的正确方法

c++ - 不同翻译单元中不可重载的非内联函数定义

c++ - 将 QPropertyAnimation 应用于 QRect

qt - Qt 5 dark Fusion主题可用于Windows吗?

c++ - 使用 "<<"将值输入自定义类

javascript - 如何隐藏其他标签的内容,只显示选中标签的内容

java - 慢速 Swing GUI 启动时间

c++ - 指向数组的指针作为模板参数

c++ - 使用 pthreads 时的后台线程(不错,优先级)

java - 第二个 JFrame 中的组件未显示