问题
Windows具有系统设置,该设置将使鼠标指针自动跳转(移动)到新的焦点元素,例如弹出对话框的默认按钮。虽然优点是速度的提高和鼠标移动的减少,但它有一个缺点:
如果在用户点击另一个元素之前发生这种情况,则用户无法及时中止他/她的操作并立即接受对话框默认按钮,因为系统会移动焦点。通常这可能需要繁琐的工作来回溯到这一点(想想一个文件选择器对话框,忘记了你之前输入的很长的路径),但它也可能意味着触发一个不可逆转的过程(例如文件删除)。
目标
基本上我想在很短的时间内禁用对话框的输入,足以防止无意中点击鼠标或按下键盘按钮。
问题
归结为一个C ++问题,即如何从继承类访问基类的对象(GUI小部件),即
(作为替代方案,我可能会重新实现在特定时间内抑制所有输入的输入事件处理程序,但是虽然我打算将时间保持很短(例如100 ms),但不会通知用户禁用的输入使用那种方法。)
可以在http://www.qtforum.org/article/24342/messagebox-auto-close-mouse-event-close.html找到从QDialogBox派生的简单类。
答案 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中找到它们,因此无法找出是否有机会访问按钮..