如何将 QInputDialog 设置为模态

Posted

技术标签:

【中文标题】如何将 QInputDialog 设置为模态【英文标题】:How to set QInputDialog as modal 【发布时间】:2017-01-10 11:13:13 【问题描述】:

我正在尝试使用来自 QtGui 的对话来获取用户的一些输入。 对于 QFileDialog,它按我的预期工作,但是当我使用 QInputDialog 时,对话框只是弹出并继续执行代码,而无需等待用户输入。 这是一个简短的例子:

from PyQt4 import QtGui
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from numpy import pi

class Canvas(FigureCanvas):
    def __init__(self):        
        self.fig = Figure()
        FigureCanvas.__init__(self, self.fig)

        self.fig.canvas.mpl_connect('key_press_event',self.key_pressed)
        self.fig.canvas.mpl_connect('button_press_event',self.on_left_click)

        self.ax = self.fig.add_axes([0,0,1,1])
        self.figure.canvas.show()

    def key_pressed(self, event):
        if event.key == 'f': 
            fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file', 
                                            'c:\\',"Image files (*.png *.jpg *.gif)")
            print fname

    def on_left_click(self,event):
        # If the mouse pointer is not on the canvas, ignore buttons
        if not event.inaxes: return

        if event.button==1:
            x=event.xdata
            y=event.ydata
            r, ok = QtGui.QInputDialog.getDouble(self, 'Text Input Dialog', 'Enter radius:', 10)
            if ok:
                self.ax.scatter(x, y, s=pi*r**2,c=0.5)
                self.draw()

cnv = Canvas()

【问题讨论】:

【参考方案1】:

我尝试使用 PySide 而不是 PyQt4 来复制它。您的代码仅打开画布小部件,然后立即将其关闭并退出。这意味着应用程序事件循环没有正常运行。

尝试更改最后几行:

app = QtGui.QApplication([])
cnv = Canvas()
app.exec_()

有了这个,一切都按预期工作。

【讨论】:

现在可以使用了,谢谢。 (我在 Spyder 中启动它,它仍然处于打开状态。)

以上是关于如何将 QInputDialog 设置为模态的主要内容,如果未能解决你的问题,请参考以下文章

PyQt:如何更改QInputDialog按钮的文本?

如何使子进程窗口在我的进程中显示为模态?

如何从 QInputDialog 中删除所有按钮

如何在 PyQt 中更改 QInputDialog 的字体大小?

如何使 QInputDialog 触发虚拟键盘显示?

如何将模态位置设置到屏幕的左下角?