【问题标题】:How to disable user interaction in a Qt application when a DialogBox shown?对话框显示时如何在 Qt 应用程序中禁用用户交互?
【发布时间】:2013-02-11 18:31:32
【问题描述】:

我有一个无模式的 QDialog 框,在我的 Qt 应用程序中弹出错误/警告,我想强制用户只关注该对话框,而不是单击应用程序中的任何内容,直到他们单击对话框上的确定。

我需要对话框保持无模式。隐藏主窗口或将其覆盖之类的解决方案是不可接受的。

目前我正在使用setModal(true); 来解决我的问题。但我认为这种方法可能会阻止主应用程序执行。

【问题讨论】:

  • 嗯,这就是模态对话框的用途,它可以阻止用户与应用程序的其余部分进行交互。
  • @JoachimPileborg 我有消息到达后台,必须由应用程序在到达时执行。
  • 如果我问如何禁用键盘和鼠标输入,我想这个问题会更清楚。
  • 我认为您想要实现的目标很愚蠢。模态对话框用于禁用背景窗口。如果您想以任何一种方式阻止背景窗口,为什么要保持无模式?我无法理解。
  • @Blood 我有一个异步系统。阻止后台应用程序意味着我会阻止更多用户触发的事件。需要明确的是,我想阻止用户事件像鼠标点击一样糟糕,但我不想阻止其他事件,比如数据包到达。

标签: c++ qt dialog modeless


【解决方案1】:

来自documentation

如果你使用show()setModal(true)一起执行一个长 操作,必须定期拨打QApplication::processEvents() 在处理期间使用户能够与对话框进行交互。

【讨论】:

    【解决方案2】:

    尝试在代码中使用qDebug 语句或使用qInstallMsgHandler 的日志文件,而不是使用QDialog 框。

    您也可以显示QTextEdit 并在那里实时发布您的日志/错误消息。

    http://qt-project.org/doc/qt-4.8/debug.html

    http://qt-project.org/doc/qt-4.8/qdebug.html#details

    http://qt-project.org/doc/qt-4.8/qtglobal.html#qInstallMsgHandler

    http://qt-project.org/doc/qt-4.8/qtextedit.html#details

    如果您仍然真的想使用 QDialog 框来调试错误,在伪模态对话框而不是模态对话框中,您可以尝试使用 eventFilters 来防止鼠标和键盘事件到达任何其他窗口,但这会很棘手允许异常仅在 QDialog 结束,但它是可行的。

    您还可以转到接受鼠标和键盘输入的一两个小部件,如果 QDialogBox 可见,则忽略输入。但是这两种显示错误的方式,但限制输入而不使其成为 Modal 真的很hacky,并且可能容易出错。

    【讨论】:

    • 这不是用来调试应用程序的,它是给用户的一个消息框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多