0

私は PyQt でテキストベースのゲームに取り組んでいます。「ウィンドウ」用の QTextDisplay と実際のプロンプト用の QLineEdit があります。これらは、ユーザーが行編集でリターン キーを押すと、テキスト表示に表示されるように接続されています。残念ながら、これは単純なコマンド プログラムではなく、GUI アプリケーションである必要があります。

実行を一時停止して、行編集へのユーザー入力を待ちたいと思います (input()コマンド アプリケーションで動作するように)。QInputDialog は、ダイアログ ボックスを起動することを除いて、このように動作します。これはかなり面倒です。while ループを試してみましたが、PyQt がそれらを気に入っているようには見えません (ハングし、実際には にヒットしませんapp.exec_())。

余談ですが、while ループが嫌いなため、Qt でゲーム ループを作成するにはどうすればよいでしょうか? QThread を使用する必要がありますか?

4

1 に答える 1

0

シグナルとスロットだけでやりたいことができると思います。Qt は独自のイベント ループを実行します。その上に 2 番目のイベント ループを記述しようとしないでください。

入力の解釈を処理するクラスで、スロット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 はそこに座って、ユーザーが突くまで何もせず、キーボード/マウス イベントのサイズ変更などを処理します。ユーザーがウィジェットで return キーをQLineEdit押すと、ウィジェットはシグナルeditingFinished( doc ) を送信します。これを作成した に接続しますSlot。これは基本的にシグナルがトリガーされるのを待つだけです (シグナルとスロットはよく考え抜かれたタイプ セーフなコールバック スキームです)。スロットがシグナルを受信すると、その機能を実行し、待機状態に戻ります。(この場合、関数は行編集ボックスからテキストを取得し、ボックスをクリアしてから、ゲーム コードで必要なことを実行します)。

于 2013-01-21T23:25:42.113 に答える