有没有办法让QLineEdit像QInputDialog那样工作?

0 投票
1 回答
728 浏览
提问于 2025-04-17 13:19

我正在用PyQt开发一个基于文本的游戏。我有一个QTextDisplay作为“窗口”,还有一个QLineEdit用来输入提示信息。这两个部分连接在一起,当用户在输入框里按下回车键时,内容会显示在文本窗口里。不过,这个程序必须是图形界面应用,而不能是简单的命令行程序,因为需要显示图片(这不是我决定的)。

我希望程序能暂停,等待用户在输入框里输入内容,类似于命令行程序里的input()函数。QInputDialog是这样工作的,但它会弹出一个对话框,这样就显得有点麻烦。我试过使用while循环,但看起来PyQt不喜欢这样(程序会卡住,根本不会执行app.exec_())。

另外,由于不喜欢使用while循环,我该如何在Qt中写一个游戏循环呢?我应该使用QThread吗?

1 个回答

0

我觉得你可以通过信号和槽来实现你想要的功能。Qt有自己的事件循环,你不需要在它上面再写一个。

在处理输入的类里,添加一个槽函数 deal_with_input,然后把信号 editingFinished 连接到这个槽函数上。

比如:

class main_window(QTextDisplay):
    def __init__(self,input_widget,parent=self,*arg,**kwargs):
        QTextDisplay.__init__(self,parent=parent) # and what ever other args you use
        self.input_widget = input_widget

        self.input_widget.editingFinished.connect(self.proc_input)

        ## what ever other set up you do

    @QtCore.Slot()
    def proc_input(self):
        input_str = self.input_widget.text()
        if input_str = '':
            return
        self.input_widget.clear()

        # do what ever it is you do with the input text, update the display

你可以对具体的类设计进行讨论(也许你不想把这个逻辑放在文本显示控件里),但这个逻辑是没问题的。

简单来说,Qt会一直待着,不会做任何事情,直到用户进行操作,然后它会处理键盘、鼠标事件、调整大小等等。当用户在 QLineEdit 控件里按下回车键时,这个控件会发出信号 editingFinished文档)。我们把这个信号连接到我们创建的一个 ,这个槽基本上就是在等待信号来触发它(信号和槽就是一种经过深思熟虑的类型安全的回调机制)。一旦槽接收到信号,它就会执行相应的功能,然后再回到等待状态。(在这个例子中,这个功能会从输入框中获取文本,清空输入框,然后执行你的游戏代码需要做的事情)。

撰写回答