PyQt 无模式对话框不会显示

Posted

技术标签:

【中文标题】PyQt 无模式对话框不会显示【英文标题】:PyQt Modeless Dialog won't show 【发布时间】:2017-11-02 22:11:45 【问题描述】:

我想在等待另一个进程接收消息时显示一个弹出对话框。我不希望这会阻止代码,因此使用 .exec_() 似乎不太理想。当我改为调用 show .show() 时,对话框根本不会弹出。有趣的是,它会显示我是否在调用它之前使用调试器,但如果我在它之后立即休眠/等待一段时间,它仍然没有显示任何内容。这是我的 PyQt 代码:

from PyQt5.QtWidgets import QApplication, QDialog, QLabel


class Main(QApplication):
   def __init__(self, *args):
       super().__init__([])
       self.popup = Popup()

   def show_popup(self, msg):
       self.popup.set_msg(msg)
       self.popup.show()


class Popup(QDialog):
   def __init__(self):
       super().__init__()
       self.label = QLabel(self)

   def set_msg(self, msg):
       self.label.setText(msg)

在我调用它的过程中,我基本上实例化了Main 对象并在发送消息后调用show_popup,等待更改文本并在收到响应后关闭。使用exec_() 会显示弹出窗口,但它会阻止代码在其他进程中运行。非常感谢任何帮助,谢谢。

【问题讨论】:

【参考方案1】:
class Popup(QMainWindow):
def __init__(self):
   super().__init__()
   self.setWindowFlags(self.windowFlags() | Qt.Tool |Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)

   self.label = QLabel(self)

def set_msg(self, msg):
   self.label.setText(msg)

我在使用 QMessageBox 和 QWidget 时遇到了问题,但它继承自 QMainWindows,它可以按我的需要工作。

【讨论】:

setWindowFlags 开头的行的目的是什么?显然,您在窗口上设置了一些标志,但为什么要使用 Qt.Tool 和其他标志?我尝试从 QMainWindow 继承,但弹出窗口仍然没有显示...我只能用 exec_() 看到它。 另外你是如何导入 Qt.Tool 和其他的?从 PyQt5 import Qt 我找不到那些模块... "from PyQt5.QtCore import Qt" 仍然无法正常工作......甚至可以在不调用 exec 的情况下创建 PyQt 窗口吗?几乎我见过的每个示例看起来都像 exec_() 在某处被调用。如果是这种情况,似乎不可能创建一个弹出窗口并让代码运行,除非该代码是从 GUI 进程本身运行的。 也许使用 QMessageBox?它使用 exec() 并且对我来说从来没有失败过。 tutorialspoint.com/pyqt/pyqt_qmessagebox.htm

以上是关于PyQt 无模式对话框不会显示的主要内容,如果未能解决你的问题,请参考以下文章

PyQT中的多对话框程序不会关闭

如何关闭登录对话框并显示主窗口(PyQt4)[重复]

无模式对话框中的 MFC C++ 显示模态对话框

从 mfc 扩展 dll 导出的无模式对话框不显示

动画效果显示对话框

能够在 PyQt5 中一次打开多个对话框的单窗口模式?