2013-04-26 9 views
6

Voglio dare Focus a un QLineEdit non appena appare ... negli altri casi (tutti i widget della stessa classe) era possibile con .setFocus() - ma qui non funziona. I miei candidati sono .activateWindow() e .raise_(), ma non riuscivo a capire come usarli.PyQt4 Dà Focus to Widget come viene chiamato dalla MainWindow e impostato come CentralWidget?

modifica: Il mio obiettivo è quello di essere in grado di digitare in QLineEdit direttamente dalla tastiera senza la necessità di premere il tasto tab o fare clic con il mouse in anticipo.

Ecco un esempio delle parti interessate in questione (funzionale):

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class Quiz(QWidget): 
    def __init__(self): 
     QWidget.__init__(self) 

     edit = QLineEdit("Select & Focus") 
     edit.selectAll() 
     edit.setFocus()    # doesn't work - no effect at all 

     vbox = QVBoxLayout() 
     vbox.addWidget(edit) 
     self.setLayout(vbox) 


class MainWindow(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 

     startQuiz = QAction("Start Quiz", self) 
     startQuiz.triggered.connect(self.startQuizQuestions) 

     menubar = self.menuBar() 
     quizMenu = menubar.addMenu("&Quiz") 
     quizMenu.addAction(startQuiz) 

     self.setGeometry(300, 300, 500, 400) 
     self.setWindowTitle("xyz") 
     self.show() 

    def startQuizQuestions(self): 
     newQuiz = Quiz() 
     self.setCentralWidget(newQuiz) 


def main(): 
    app = QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

Se mi stai vedendo terribilmente abusando Python o PyQt4 ... sentitevi liberi di criticare, voglio imparare.

edit: ho trovato nel PySide Docs per .activateWindow questo "commento" scoraggiante: "In Windows, se si chiama questo quando l'applicazione non è attualmente quello attivo allora non rendere la finestra attiva." - Ma intendo che è la finestra attiva (= MainWindow) è solo un altro Widget nel CentralWidget della finestra attiva. (?)

risposta

10

Funziona se si assegna un widget al widget.

Ecco la funzione init del widget con un nuovo argomento principale, utilizzato per QWidget. Quindi QWidget viene utilizzato come padre per l'etichetta.

def __init__(self, parent=None): 
    QWidget.__init__(self, parent) 

    edit = QLineEdit("Select & Focus", self) 
    edit.selectAll() 
    edit.setFocus()    # works now 

    vbox = QVBoxLayout() 
    vbox.addWidget(edit) 
    self.setLayout(vbox) 

dopo che si deve passare il MainWindow come genitore al widget in questo modo:

newQuiz = Quiz(self) 
Problemi correlati