有没有办法让QLineEdit像QInputDialog那样工作?
我正在用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
(文档)。我们把这个信号连接到我们创建的一个 槽
,这个槽基本上就是在等待信号来触发它(信号和槽就是一种经过深思熟虑的类型安全的回调机制)。一旦槽接收到信号,它就会执行相应的功能,然后再回到等待状态。(在这个例子中,这个功能会从输入框中获取文本,清空输入框,然后执行你的游戏代码需要做的事情)。