0

我正在使用 PyQt 开发基于文本的游戏。我有一个用于“窗口”的 QTextDisplay 和一个用于实际提示的 QLineEdit。它们被连接起来,因此当用户在行编辑中按回车键时,它会出现在文本显示中。不幸的是,这需要一个 GUI 应用程序而不是一个简单的命令程序,因为需要有图片(不是我的决定)。

我希望执行暂停并等待用户输入到行编辑中(很像input()在命令应用程序中的工作)。QInputDialog 以这种方式运行,除了启动一个对话框。这很麻烦。我已经尝试过 while 循环,但看起来 PyQt 并不喜欢它们(它挂起并且实际上并没有命中app.exec_())。

顺便说一句,由于不喜欢 while 循环,我将如何在 Qt 中编写游戏循环?我应该使用 QThread 吗?

4

1 回答 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( doc )。我们将它连接到Slot我们创建的 a,它基本上只是等待信号触发它(信号和插槽只是一个经过深思熟虑的类型安全回调方案)。一旦插槽接收到信号,它就会执行它的功能,然后返回等待。(在这种情况下,该函数从行编辑框中获取文本,清除该框,然后执行您的游戏代码需要执行的操作)。

于 2013-01-21T23:25:42.113 回答