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

时间:2013-07-18 09:27:27

标签: c++ qt user-interface

问题

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

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

目标

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

问题

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

  1. 禁用QMessageBox的按钮小部件
  2. 启动单击QTimer并将其连接到
  3. 的插槽
  4. 启用以前禁用的小部件
  5. (作为替代方案,我可能会重新实现在特定时间内抑制所有输入的输入事件处理程序,但是虽然我打算将时间保持很短(例如100 ms),但不会通知用户禁用的输入使用那种方法。)

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

2 个答案:

答案 0 :(得分:3)

是否需要使用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

最后一点是留给读者的练习:)

答案 1 :(得分:0)

要启用/禁用QMessagebox中的按钮,需要访问它们。

qmessagebox.cpp使用buttonBox = new QDialogButtonBox;和addButton()方法

d->buttonBox->addButton(button, (QDialogButtonBox::ButtonRole)role);
d->customButtonList.append(button);

但是我不理解Qt内部,我无法在qmessagebox.h中找到它们,因此无法找出是否有机会访问按钮..