2013-03-22 10 views
16

Ho creato un'app per un gioco, semplice da avviare. È un gioco in cui il sistema sceglie a caso un numero e un giocatore (giocatore) cerca di scoprire il numero. Tutto è quasi finito. L'app è composta da QLineEdit, un'etichetta e tre pulsanti. Una volta che l'app indica al giocatore la gamma del numero desiderato, digita uno numero di scommessa e fa clic sul pulsante di riproduzione. E in base a questo numero riceve un messaggio su quanto vicino o lontano il numero desiderato è lontano dallo numero di scommessa.Rilevamento di immissione su QLineEdit o QPushButton

Ma trovo un po 'disgustoso fare clic su un pulsante. Invece voglio usare Immettere la chiave per giocare. Quindi, per raggiungere questo obiettivo, si tratta di specificamente due domande:

  1. Come potrebbe un cambiamento utilizzando Inserisci per giocare (voglio dire ho bisogno di sapere quando QLineEdit rileva entrano viene premuto il tasto)? In questo modo codificherò correttamente per indicare il metodo di gioco.

  2. Se il pulsante di riproduzione ha il focus, come si usa il tasto invio su questo pulsante? (Rendere pulsante Accetta il tasto Enter)

+0

http: // StackOverflow .com/questions/2078842/qlineedit-how-to-handle-up-and-down-arrows –

risposta

11

QLineEdit emetterà il segnale returnPressed() ogni volta che l'utente preme il tasto Invio mentre in esso: http://qt-project.org/doc/qt-4.8/qlineedit.html#signals. Puoi connettere questo segnale allo slot click() del tuo pulsante o chiamare direttamente qualsiasi segnale a cui è stato collegato il segnale clicked() del pulsante.

+0

Grazie per la tua risposta Ho questo: connect (self.txtNumGetter, SIGNAL (returnPressed()), self.btnPlayGame, SIGNAL (cliccato())); ma non funziona. O dove deve essere scritta questa riga di codice? – arkero24

+0

I segnali devono sempre essere collegati agli slot. 'clicked()' è un * segnale * di 'QPushButton', tuttavia, quindi non puoi connetterti a niente --- dovresti usare lo * slot *' click() 'invece (senza la fine' ed'). – rainer

25

Per la QLineEdit collegarsi al segnale returnPressed, se si utilizza il metodo setAutoDefault sul QPushButton s si emettono il segnale clicked quando Enter viene premuto su una mirata QPushButton:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import sip 
sip.setapi('QString', 2) 
sip.setapi('QVariant', 2) 

from PyQt4 import QtGui, QtCore 

class MyWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     self.pushButtonOK = QtGui.QPushButton(self) 
     self.pushButtonOK.setText("OK") 
     self.pushButtonOK.clicked.connect(self.on_pushButtonOK_clicked) 
     self.pushButtonOK.setAutoDefault(True) 

     self.lineEditNumber = QtGui.QLineEdit(self) 
     self.lineEditNumber.returnPressed.connect(self.pushButtonOK.click) 

     self.layoutHorizontal = QtGui.QHBoxLayout(self) 
     self.layoutHorizontal.addWidget(self.pushButtonOK) 
     self.layoutHorizontal.addWidget(self.lineEditNumber) 

    @QtCore.pyqtSlot() 
    def on_pushButtonOK_clicked(self): 
     inputNumber = self.lineEditNumber.text() 
     if inputNumber.isdigit(): 
      info = "You selected `{0}`" 

     else: 
      info = "Please select a number, `{0}` isn't valid!" 

     print info.format(inputNumber) 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.show() 

    sys.exit(app.exec_()) 
+1

Devo dire grazie mille per il vostro supporto. Ho finalmente risolto il problema collegando il lineedit allo slot tramite un segnale 'returnPressed' ... self.txtCode.returnPressed.connect (self.mySlot) In questo modo il mio codice ora è totalmente funzionante. Grazie ragazzi!! – arkero24

+1

Considera di accettare questa risposta cliccando sul segno di spunta. – Charlie

+0

qualche idea su come fare questo con un QComboBox? – TheInitializer