1

问题

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

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

目标

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

问题

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

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

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

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

4

2 回答 2

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

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

于 2013-07-18T09:38:27.777 回答
0

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

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

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

但我不了解 Qt 内部结构,无法在 qmessagebox.h 中找到这些内容,因此无法确定是否有机会访问这些按钮。

于 2013-07-18T12:35:37.437 回答