Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QlineEdit with return to next QlineEdit



  • Hallo Leute,
    ich bin neu hier und auch noch nicht so fit :)
    Ich möchte gerne in einer QLineEdit was eintragen und durch das drücken von Enter zur nächsten QlineEdit gehen. Ich habe schon probiert eine Schleife in Python zu machen mit dem Signal "returnpressed()" aber nicht hinbekommen.
    Auserdem Ist es möglich, wenn ich in eine QlineEdit reingeklickt habe diese Qline.. an eine Function weiter zu geben?
    Danke euch schon mal.
    Gruß



  • Dazu brauchst du keine Schleife, sondern nur einen Slot, der mit returnPressed() verbunden ist.



  • Hallo,
    wie gesagt ich bin noch nicht fit :)
    w.connect(w.Operator_1,SIGNAL("returnPressed()"),setNextOp)
    def setNextOp():
    w.Operator_2.setCursorPosition()
    w.Operator_2.selectAll()

    Wäre das so richtig?
    Zur erklärung was ich möchte,
    Ich habe 15 QlineEdit, ich möchte durch das drücken von der Returntaste, mich durch die Felder bewegen.
    Zusäzlich möchte die Qline in der ich mich befinde an eine weiter function übergeben.

    Danke!
    Gruß

    und im



  • Ich habe das jetzt so gemach
    w.connect(w.Operator_1,SIGNAL("returnPressed()"), setNextOp)
    def setNextOp():
    w.Operator_2.setFocus()
    da ich aber 15 Qlineedit ("Operator 1 - 15") habe muss ich das irgendwie Dynamisch hinbekommen.
    Hat jemand eine Idee?
    Dank Und Gruß
    Roman



  • @Roman2052

    Ist das nicht dasselbe wie wenn man Tab drückt?
    Man könnte entweder bei Enter ein Tab KeyEvent an das Widget senden oder du packst die QLineEdits in einen Container und iterierst da durch. Den aktuellen Index kannst du dir dann irgendwo speichern und beim letzten dann theoretisch wieder auf das erste Widget zurück springen. Bei Enter dann einfach um eins erhöhen und das Widget an der Stelle fokussieren.
    Das aktuelle Widget wäre dann das focusWidget() oder das QLineEdit an der Stelle von dem aktuellen Iterator im Container.



  • Hallo ich bin ein stück weiter. Danke bis hierhin.
    wie kann ich eine Qline ansprechen mit dem Adresse- oder hexadecimal code?
    mit dem "QObject.connect(app, SIGNAL("focusChanged(QWidget *, QWidget *)"), changedFocusSlot)" bekomme ich z.B. 0x06F1C530
    Wie kann ich die jetzt anspechen und ein wert reinschreiben lassen?

    Danke
    Gruß


  • Lifetime Qt Champion

    @Roman2052 Bin mir nicht sicher ich verstehe die Frage.
    Meinst du eines der Zeiger aus der Parameterliste von dem Signal?
    Füge deinem Slot die gleichen Parameter und benutze die Zeiger wie auch sonst in C++:

    void MyClass::changedFocusSlot(QWidget *old, QWidget *now)
    {
        qobject_cast<QLineEdit*>(now)->setText("New text");
    }
    


  • Danke. @jsulm
    Ich habe eine line edit, und möchte durch ein Button diese mit einem Wert füllen.
    Dann eine andere lineedit auswählen und wieder durch den Button beschreiben. Unsw.
    Gruß Roman



  • Normalerweise sage ich ja.@jsulm
    Self. Connect(self. Button, SIGNAL( "clicked()") , set value)
    Def setvalue() ;
    Self. QlineEdit. SetText("test")

    Jetzt habe ich aber keine QlineEdit sondern diese Adresse bzw. Hexa Code.


  • Lifetime Qt Champion

    @Roman2052 said in QlineEdit with return to next QlineEdit:

    Jetzt habe ich aber keine QlineEdit sondern diese Adresse bzw. Hexa Code

    Was für eine Adresse?
    Was soll das sein:

    Self. Connect(self. Button, SIGNAL( "clicked()") , set value)
    

    ?
    Kannst du bitte deinen Code posten und nicht etwas was keinen Sinn ergibt?
    Und warum reden wir jetzt von clicked() signal wo doch vorher focusChanged() das Thema war?

    Verbinde einfach einen Slot mit clicked() Signal von deinem Button. In diesem Slot nehme nächstes QLineEdit und schreibe den Text da rein. Falls du in den QLineEdit schreiben willst welches gerade Fokus hat kannst du ja über die QLineEdits iterieren und mit https://doc.qt.io/qt-5/qwidget.html#focus-prop rausfinden welches davon Fokus hat...



  • hallo @jsulm ,

    sorry war bisschen verwirend.
    hier das skript

    def SetOperator(old,now):
        old.setText(">")
    
    def changedFocusSlot(old, now):
        if (now==None and QApplication.activeWindow()!=None):
            print "set focus to the active window"
            QApplication.activeWindow().setFocus()
        w.connect(w.pushButtonKleiner,SIGNAL("clicked()"),partial(SetOperator,old,now))
    
    app = QApplication(sys.argv)
    w = loadUi("RechnenMaxim.ui")
    w.connect(w.NeueAufgabe,SIGNAL("clicked()"),NeueAufgabeGen)
    w.connect(w.LoesungZeigen,SIGNAL("clicked()"),Loesung)
    w.connect(w.radioButtonPlus,SIGNAL("clicked()"),deselectSelection)
    w.connect(w.radioButtonMinus,SIGNAL("clicked()"),deselectSelection)
    w.connect(w.radioButtonMal,SIGNAL("clicked()"),deselectSelection)
    w.connect(w.radioButtonGeteilt,SIGNAL("clicked()"),deselectSelection)
    w.connect(w.radioAdd,SIGNAL("clicked()"),deselectSelection)
    w.connect(w.radioComp,SIGNAL("clicked()"),deselectSelection)
    QObject.connect(app, SIGNAL("focusChanged(QWidget *, QWidget *)"), changedFocusSlot)
    #w.connect(w.pushButtonKleiner,SIGNAL("clicked()"),partial(SetOperator,focus=changedFocusSlot))
     
    w.show()
    sys.exit(app.exec_())
    


  • Zum ablauf.
    Ich möchte eine LineEdit per maus klick anwählen-> dann auf ein Button drücken-> und die Line soll dan befült werden. Führe ich mein skript aus, wird alles was ich mit der Maus angeklickt habe mit dem Wert befüllt. Die old scheint eine collection zu sein, ist das richtig?


  • Lifetime Qt Champion

    @Roman2052 Wie ich schon vorgeschlagen habe:
    "Verbinde einfach einen Slot mit clicked() Signal von deinem Button. In diesem Slot nehme nächstes QLineEdit und schreibe den Text da rein. Falls du in den QLineEdit schreiben willst welches gerade Fokus hat kannst du ja über die QLineEdits iterieren und mit https://doc.qt.io/qt-5/qwidget.html#focus-prop rausfinden welches davon Fokus hat..."



  • @jsulm Danke
    Aber wenn doch auf den button clicke dann ist doch der focus nicht mehr auf der LineEdit sondern auf dem Button. Oder habe ich da ein verständniss problem?


  • Lifetime Qt Champion

    @Roman2052 Stimmt. Das wird so nicht funktionieren. Was du dann machen kannst: sobald eines der line edits ausgewählt wird (Fokus) merkst du dir diese Instanz (self.__lastLineEdit = ...) und benutzt die sobald Button angeclickt wird. D.h. der clicked() Signal is mit nur einem Slot verbunden, in diesem Slot benutzt du die zuvor gespeicgerte Referenz zum zuletzt ausgewählten LineEdit.



  • @jsulm
    es scheint noch Irgendwas falsch zu sein :(

    w.Operator_1.selectionChanged.connect(partial(safeLastLine,1))
    w.Operator_2.selectionChanged.connect(partial(safeLastLine,2))
    w.Operator_3.selectionChanged.connect(partial(safeLastLine,3))
    w.Operator_4.selectionChanged.connect(partial(safeLastLine,4))
    w.Operator_5.selectionChanged.connect(partial(safeLastLine,5))
    w.Operator_6.selectionChanged.connect(partial(safeLastLine,6))

    def safeLastLine(i):
    nowLine=None
    nowLine=getattr(w,"Operator_{}".format(i))
    w.pushButtonKleiner.pressed.connect(partial(SetOperator,nowLine,Text=str(w.pushButtonKleiner.text())))
    w.pushButtonGleich.pressed.connect(partial(SetOperator,nowLine,Text=str(w.pushButtonGleich.text())))
    w.pushButtonGroesser.pressed.connect(partial(SetOperator,nowLine,Text=str(w.pushButtonGroesser.text())))

    def SetOperator(nowLine,Text):
    nowLine.setText(Text)
    nowLine=None

    Wenn ich jetzt Operator_1 doppelt anklicke und auf den pushButtonKleiner drücke schreibt er mir in den Operator_1 das zeichen "<" rein. Soweit gut.
    Wenn ich jetzt Operator_2 doppelt anklicke und auf den pushButtonGleich drücke schreibt er mir jetzt in den Operator_1 und in den Operator_2 das zeichen "=" rein.
    es geht dann immer so weiter.
    Warum?


  • Lifetime Qt Champion

    @Roman2052 Hier ist so einiges falsch. Warum selectionChanged? Das hat ja mit Fokus nchts zu tun.

    def safeLastLine(i):
        nowLine=None // sollte das nicht self.nowLine sein - wie willst du sonst später darauf zugreifen?
        nowLine=getattr(w,"Operator_{}".format(i))
        # Wieso machst du connect hier? Dir ist  schon klar, dass du jedesmal die connects machst wenn safeLastLine aufgerufen wird? Mach das einmal im Konstruktor
    w.pushButtonKleiner.pressed.connect(partial(SetOperator,nowLine,Text=str(w.pushButtonKleiner.text())))
    w.pushButtonGleich.pressed.connect(partial(SetOperator,nowLine,Text=str(w.pushButtonGleich.text())))
    w.pushButtonGroesser.pressed.connect(partial(SetOperator,nowLine,Text=str(w.pushButtonGroesser.text())))
    

    Die Idee ist eigentlich etwas anders:

    # Das ist der slot für QApplication::focusChanged
    def onFocusChanged(self, old, now):
        # Hier sollte noch geprüft werden ob now ein QLineEdit ist und nur dann self.__now setzen
        self.__now = now
    
    # Das ist der slot für die Buttons (musst du dich noch um den Text kümmern)
    def onButtonClicked(self):
        if self.__now:
            self.__now.setText("TEXT")
    


  • @jsulm
    DANKE du bist der Beste :)


Log in to reply