我正在PyQt开发基于文本的游戏。我有一个用于“窗口”的QTextDisplay和一个用于实际提示的QLineEdit。它们被连接起来,以便当用户点击行编辑中的返回键时,它出现在文本显示中。不幸的是,这需要是一个GUI应用程序,而不是一个简单的命令程序,因为需要有图片(而不是我的决定)。
我希望执行暂停并等待用户输入到行编辑(很像input()
在命令应用程序中工作)。除了启动对话框外,QInputDialog以这种方式运行。这非常麻烦。我尝试过while循环,但它看起来不像PyQt喜欢它们(它挂起并且实际上没有碰到app.exec_()
)。
另一方面,由于不喜欢while循环,我将如何在Qt中编写游戏循环?我应该使用QThread吗?
答案 0 :(得分: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
,它基本上只是等待信号触发它(信号和插槽只是一个经过深思熟虑的类型安全回调方案)。一旦插槽重现信号,它就会执行它的功能,然后再返回等待状态。 (在这种情况下,该函数从行编辑框中抓取文本,清除该框,然后执行您的游戏代码需要执行的操作)。