2013-04-26 3 views
6

Ich möchte Focus einem QLineEdit geben, sobald es erscheint ... in anderen Fällen (alle Widgets innerhalb derselben Klasse) war es möglich mit .setFocus() - aber hier funktioniert das nicht. Meine Kandidaten sind .activateWindow() und .raise_(), aber ich konnte es nicht herausfinden, wie man sie benutzt.PyQt4 Gib dem Widget Widget, wie es vom MainWindow aufgerufen und als CentralWidget festgelegt wird?

edit: Mein Ziel ist es, in die QLineEdit von der Tastatur, ohne dass direkt eingeben, um die tab-Taste oder klicken Sie mit der Maus im Voraus getroffen.

Hier ein Beispiel für die entsprechenden Teile in Frage (funktionell):

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() 

Wenn du mich sehen schrecklich Python oder PyQt4 mißbrauchen ... fühlen Sie sich frei zu kritisieren, ich will lernen.

edit: Ich fand in der PySide Docs für .activateWindow diese entmutigende "Kommentar": "Unter Windows, wenn Sie dies aufrufen, wenn die Anwendung derzeit nicht die aktive ist dann wird es nicht das aktive Fenster." - Aber ich meine es ist das aktive Fenster (= MainWindow) es ist nur ein anderes Widget im CentralWidget des aktiven Fensters. (?)

Antwort

10

Es funktioniert, wenn Sie dem Widget ein Elternteil geben.

Hier ist die Init-Funktion des Widgets mit einem neuen Elternargument, das für das QWidget verwendet wird. Dann wird das QWidget als Eltern für das Label verwendet.

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) 

Danach müssen Sie die MainWindow als Elternteil auf das Widget wie folgt passieren:

newQuiz = Quiz(self)