Probleme QTextEdit

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
opccorsa
User
Beiträge: 34
Registriert: Samstag 20. Juli 2013, 07:43

Hallo liebe Gemeinde

Ich habe wieder einige Probleme mit dem Zusammenspiel PyQt4 und Python. Ich habe eine Eingabe/Ausgabe Maske. Da möchte ich nacheinander alle Daten abfragen. Also erstes QTextEdit (o.ä.) -> Eingabe mit Return beenden und zum nächsten QTextEdit springen. Leider habe ich jetzt schon mehrere Tage Versuche gefahren, habe es nicht hinbekommen. Einiges sieht man noch im Quelltext. Anbei der Code der UI und das Programm. Ich Danke euch schon mal.

Code: Alles auswählen

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'guipy1.ui'
#
# Created: Wed Jan 21 11:16:13 2015
#      by: PyQt4 UI code generator 4.11.2
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(1920, 1080)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
        Dialog.setSizePolicy(sizePolicy)
        self.Fertigungsauftrag = QtGui.QLabel(Dialog)
        self.Fertigungsauftrag.setGeometry(QtCore.QRect(40, 20, 122, 17))
        self.Fertigungsauftrag.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.Fertigungsauftrag.setObjectName(_fromUtf8("Fertigungsauftrag"))
        self.pB_Einrichtermodus = QtGui.QPushButton(Dialog)
        self.pB_Einrichtermodus.setGeometry(QtCore.QRect(1690, 750, 151, 61))
        self.pB_Einrichtermodus.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.pB_Einrichtermodus.setIconSize(QtCore.QSize(16, 16))
        self.pB_Einrichtermodus.setObjectName(_fromUtf8("pB_Einrichtermodus"))
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(200, 20, 90, 17))
        self.label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(330, 20, 115, 17))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.tE_Fertigungsauftrag = QtGui.QTextEdit(Dialog)
        self.tE_Fertigungsauftrag.setGeometry(QtCore.QRect(40, 40, 121, 31))
        self.tE_Fertigungsauftrag.setAutoFillBackground(True)
        self.tE_Fertigungsauftrag.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
        self.tE_Fertigungsauftrag.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.tE_Fertigungsauftrag.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.tE_Fertigungsauftrag.setTextInteractionFlags(QtCore.Qt.TextEditable)
        self.tE_Fertigungsauftrag.setObjectName(_fromUtf8("tE_Fertigungsauftrag"))
        self.tE_Kt = QtGui.QTextEdit(Dialog)
        self.tE_Kt.setGeometry(QtCore.QRect(200, 40, 91, 31))
        self.tE_Kt.setObjectName(_fromUtf8("tE_Kt"))
        self.tE_Pn = QtGui.QTextEdit(Dialog)
        self.tE_Pn.setGeometry(QtCore.QRect(330, 40, 121, 31))
        self.tE_Pn.setObjectName(_fromUtf8("tE_Pn"))
        self.pB_Beenden = QtGui.QPushButton(Dialog)
        self.pB_Beenden.setGeometry(QtCore.QRect(1690, 950, 151, 61))
        self.pB_Beenden.setObjectName(_fromUtf8("pB_Beenden"))
        self.graphicsView = QtGui.QGraphicsView(Dialog)
        self.graphicsView.setGeometry(QtCore.QRect(230, 320, 1421, 561))
        self.graphicsView.setObjectName(_fromUtf8("graphicsView"))
        self.textEdit_4 = QtGui.QTextEdit(Dialog)
        self.textEdit_4.setGeometry(QtCore.QRect(230, 920, 1361, 91))
        self.textEdit_4.setObjectName(_fromUtf8("textEdit_4"))
        self.pB_Nacharbeit = QtGui.QPushButton(Dialog)
        self.pB_Nacharbeit.setGeometry(QtCore.QRect(40, 320, 151, 61))
        self.pB_Nacharbeit.setObjectName(_fromUtf8("pB_Nacharbeit"))
        self.pB_Ausschuss = QtGui.QPushButton(Dialog)
        self.pB_Ausschuss.setGeometry(QtCore.QRect(40, 390, 151, 61))
        self.pB_Ausschuss.setObjectName(_fromUtf8("pB_Ausschuss"))
        self.pB_Ersatzteil = QtGui.QPushButton(Dialog)
        self.pB_Ersatzteil.setGeometry(QtCore.QRect(40, 460, 151, 61))
        self.pB_Ersatzteil.setObjectName(_fromUtf8("pB_Ersatzteil"))
        self.listView = QtGui.QListView(Dialog)
        self.listView.setGeometry(QtCore.QRect(40, 540, 151, 471))
        self.listView.setObjectName(_fromUtf8("listView"))
        self.label_3 = QtGui.QLabel(Dialog)
        self.label_3.setGeometry(QtCore.QRect(1690, 320, 150, 20))
        self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.label_4 = QtGui.QLabel(Dialog)
        self.label_4.setGeometry(QtCore.QRect(1690, 390, 150, 20))
        self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.label_5 = QtGui.QLabel(Dialog)
        self.label_5.setGeometry(QtCore.QRect(1679, 460, 161, 20))
        self.label_5.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.label_5.setObjectName(_fromUtf8("label_5"))
        self.tE_Nach = QtGui.QTextEdit(Dialog)
        self.tE_Nach.setGeometry(QtCore.QRect(1720, 340, 121, 31))
        self.tE_Nach.setObjectName(_fromUtf8("tE_Nach"))
        self.tE_Ausschuss = QtGui.QTextEdit(Dialog)
        self.tE_Ausschuss.setGeometry(QtCore.QRect(1720, 410, 121, 31))
        self.tE_Ausschuss.setObjectName(_fromUtf8("tE_Ausschuss"))
        self.tE_gE = QtGui.QTextEdit(Dialog)
        self.tE_gE.setGeometry(QtCore.QRect(1720, 480, 121, 31))
        self.tE_gE.setObjectName(_fromUtf8("tE_gE"))
        self.label_6 = QtGui.QLabel(Dialog)
        self.label_6.setGeometry(QtCore.QRect(40, 280, 118, 17))
        self.label_6.setObjectName(_fromUtf8("label_6"))
        self.label_7 = QtGui.QLabel(Dialog)
        self.label_7.setGeometry(QtCore.QRect(830, 280, 128, 17))
        self.label_7.setObjectName(_fromUtf8("label_7"))
        self.label_8 = QtGui.QLabel(Dialog)
        self.label_8.setGeometry(QtCore.QRect(1600, 280, 108, 17))
        self.label_8.setObjectName(_fromUtf8("label_8"))
        self.horizontalLayoutWidget = QtGui.QWidget(Dialog)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(40, 80, 1801, 121))
        self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget"))
        self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setMargin(0)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.graphicsView_2 = QtGui.QGraphicsView(self.horizontalLayoutWidget)
        self.graphicsView_2.setObjectName(_fromUtf8("graphicsView_2"))
        self.horizontalLayout.addWidget(self.graphicsView_2)
        self.graphicsView_3 = QtGui.QGraphicsView(self.horizontalLayoutWidget)
        self.graphicsView_3.setObjectName(_fromUtf8("graphicsView_3"))
        self.horizontalLayout.addWidget(self.graphicsView_3)
        self.graphicsView_4 = QtGui.QGraphicsView(self.horizontalLayoutWidget)
        self.graphicsView_4.setObjectName(_fromUtf8("graphicsView_4"))
        self.horizontalLayout.addWidget(self.graphicsView_4)
        self.graphicsView_5 = QtGui.QGraphicsView(self.horizontalLayoutWidget)
        self.graphicsView_5.setObjectName(_fromUtf8("graphicsView_5"))
        self.horizontalLayout.addWidget(self.graphicsView_5)
        self.graphicsView_9 = QtGui.QGraphicsView(self.horizontalLayoutWidget)
        self.graphicsView_9.setObjectName(_fromUtf8("graphicsView_9"))
        self.horizontalLayout.addWidget(self.graphicsView_9)
        self.graphicsView_6 = QtGui.QGraphicsView(self.horizontalLayoutWidget)
        self.graphicsView_6.setObjectName(_fromUtf8("graphicsView_6"))
        self.horizontalLayout.addWidget(self.graphicsView_6)
        self.graphicsView_7 = QtGui.QGraphicsView(self.horizontalLayoutWidget)
        self.graphicsView_7.setObjectName(_fromUtf8("graphicsView_7"))
        self.horizontalLayout.addWidget(self.graphicsView_7)
        self.graphicsView_8 = QtGui.QGraphicsView(self.horizontalLayoutWidget)
        self.graphicsView_8.setObjectName(_fromUtf8("graphicsView_8"))
        self.horizontalLayout.addWidget(self.graphicsView_8)
        self.horizontalLayoutWidget_2 = QtGui.QWidget(Dialog)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(40, 210, 1801, 51))
        self.horizontalLayoutWidget_2.setObjectName(_fromUtf8("horizontalLayoutWidget_2"))
        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_2.setMargin(0)
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.lcd1 = QtGui.QLCDNumber(self.horizontalLayoutWidget_2)
        self.lcd1.setObjectName(_fromUtf8("lcd1"))
        self.horizontalLayout_2.addWidget(self.lcd1)
        self.lcd2 = QtGui.QLCDNumber(self.horizontalLayoutWidget_2)
        self.lcd2.setObjectName(_fromUtf8("lcd2"))
        self.horizontalLayout_2.addWidget(self.lcd2)
        self.lcd3 = QtGui.QLCDNumber(self.horizontalLayoutWidget_2)
        self.lcd3.setObjectName(_fromUtf8("lcd3"))
        self.horizontalLayout_2.addWidget(self.lcd3)
        self.lcd4 = QtGui.QLCDNumber(self.horizontalLayoutWidget_2)
        self.lcd4.setObjectName(_fromUtf8("lcd4"))
        self.horizontalLayout_2.addWidget(self.lcd4)
        self.lcd5 = QtGui.QLCDNumber(self.horizontalLayoutWidget_2)
        self.lcd5.setObjectName(_fromUtf8("lcd5"))
        self.horizontalLayout_2.addWidget(self.lcd5)
        self.lcd6 = QtGui.QLCDNumber(self.horizontalLayoutWidget_2)
        self.lcd6.setObjectName(_fromUtf8("lcd6"))
        self.horizontalLayout_2.addWidget(self.lcd6)
        self.lcd7 = QtGui.QLCDNumber(self.horizontalLayoutWidget_2)
        self.lcd7.setObjectName(_fromUtf8("lcd7"))
        self.horizontalLayout_2.addWidget(self.lcd7)
        self.lcd8 = QtGui.QLCDNumber(self.horizontalLayoutWidget_2)
        self.lcd8.setObjectName(_fromUtf8("lcd8"))
        self.horizontalLayout_2.addWidget(self.lcd8)
        self.tE_PT = QtGui.QTextEdit(Dialog)
        self.tE_PT.setGeometry(QtCore.QRect(170, 270, 121, 31))
        self.tE_PT.setMinimumSize(QtCore.QSize(0, 31))
        self.tE_PT.setObjectName(_fromUtf8("tE_PT"))
        self.tE_VT = QtGui.QTextEdit(Dialog)
        self.tE_VT.setGeometry(QtCore.QRect(970, 270, 121, 31))
        self.tE_VT.setMinimumSize(QtCore.QSize(0, 31))
        self.tE_VT.setObjectName(_fromUtf8("tE_VT"))
        self.tE_Am = QtGui.QTextEdit(Dialog)
        self.tE_Am.setGeometry(QtCore.QRect(1720, 270, 121, 31))
        self.tE_Am.setMinimumSize(QtCore.QSize(0, 31))
        self.tE_Am.setObjectName(_fromUtf8("tE_Am"))
        self.pB_Pause = QtGui.QPushButton(Dialog)
        self.pB_Pause.setEnabled(True)
        self.pB_Pause.setGeometry(QtCore.QRect(1690, 850, 151, 61))
        self.pB_Pause.setObjectName(_fromUtf8("pB_Pause"))
        self.QL_Time = QtGui.QLabel(Dialog)
        self.QL_Time.setGeometry(QtCore.QRect(1600, 30, 81, 31))
        self.QL_Time.setText(_fromUtf8(""))
        self.QL_Time.setObjectName(_fromUtf8("QL_Time"))
        self.QL_Date = QtGui.QLabel(Dialog)
        self.QL_Date.setGeometry(QtCore.QRect(1730, 20, 81, 31))
        self.QL_Date.setText(_fromUtf8(""))
        self.QL_Date.setObjectName(_fromUtf8("QL_Date"))
        self.graphicsView_10 = QtGui.QGraphicsView(Dialog)
        self.graphicsView_10.setGeometry(QtCore.QRect(1690, 610, 151, 131))
        self.graphicsView_10.setObjectName(_fromUtf8("graphicsView_10"))
        self.lcd_ist = QtGui.QLCDNumber(Dialog)
        self.lcd_ist.setGeometry(QtCore.QRect(1700, 520, 101, 81))
        self.lcd_ist.setFrameShape(QtGui.QFrame.NoFrame)
        self.lcd_ist.setFrameShadow(QtGui.QFrame.Plain)
        self.lcd_ist.setDigitCount(2)
        self.lcd_ist.setProperty("value", 0.0)
        self.lcd_ist.setObjectName(_fromUtf8("lcd_ist"))
        self.label_9 = QtGui.QLabel(Dialog)
        self.label_9.setGeometry(QtCore.QRect(1780, 530, 71, 61))
        font = QtGui.QFont()
        font.setPointSize(48)
        font.setBold(False)
        font.setItalic(True)
        font.setWeight(50)
        self.label_9.setFont(font)
        self.label_9.setAlignment(QtCore.Qt.AlignCenter)
        self.label_9.setObjectName(_fromUtf8("label_9"))
        self.trtr = QtGui.QLineEdit(Dialog)
        self.trtr.setGeometry(QtCore.QRect(360, 270, 331, 27))
        self.trtr.setObjectName(_fromUtf8("trtr"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
        Dialog.setTabOrder(self.tE_Fertigungsauftrag, self.tE_Kt)
        Dialog.setTabOrder(self.tE_Kt, self.tE_Pn)
        Dialog.setTabOrder(self.tE_Pn, self.pB_Einrichtermodus)
        Dialog.setTabOrder(self.pB_Einrichtermodus, self.pB_Beenden)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.Fertigungsauftrag.setText(_translate("Dialog", "Fertigungsauftrag", None))
        self.pB_Einrichtermodus.setText(_translate("Dialog", "Einrichtermodus", None))
        self.label.setText(_translate("Dialog", "Kostenträger", None))
        self.label_2.setText(_translate("Dialog", "Personalnummer", None))
        self.pB_Beenden.setText(_translate("Dialog", "Beenden", None))
        self.pB_Nacharbeit.setText(_translate("Dialog", "Nacharbeit", None))
        self.pB_Ausschuss.setText(_translate("Dialog", "Ausschuss", None))
        self.pB_Ersatzteil.setText(_translate("Dialog", "Ersatzteil", None))
        self.label_3.setText(_translate("Dialog", "ges. Nacharbeiten:", None))
        self.label_4.setText(_translate("Dialog", "ges. Ausschuss:", None))
        self.label_5.setText(_translate("Dialog", "geforderte Erstazteile:", None))
        self.label_6.setText(_translate("Dialog", "Produzierte Teile:", None))
        self.label_7.setText(_translate("Dialog", "Verbleibende Teile:", None))
        self.label_8.setText(_translate("Dialog", "Auftragsmenge:", None))
        self.pB_Pause.setText(_translate("Dialog", "Pause", None))
        self.label_9.setText(_translate("Dialog", "%", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
***************************************************************************************************************************

Code: Alles auswählen

#! /usr/bin/env python

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

import commands
import time, thread
import serial
import sys
import os
from PyQt4 import QtGui, QtCore
from guipy1 import Ui_Dialog
from PyQt4.QtCore import pyqtSignal
from PyQt4 import QtCore as qtcore

class MeinDialog(QtGui.QDialog, Ui_Dialog):
        werte = ""
        my_signal = pyqtSignal(str)


        def __init__(self):
                QtGui.QDialog.__init__(self)
                self.setupUi(self)

        # Slots einrichten
                self.connect(self.pB_Einrichtermodus, QtCore.SIGNAL("clicked()"), self.onEinrichter)
                
        #self.connect(self.trtr, QtCore.SIGNAL("returnPressed()"), self.test())
                self.trtr.returnPressed.connect(lambda: self.test())
 
                #self.trtr = QtGui.QLineEdit()
                #self.trtr.setPlaceholderText('input here')
                #self.trtr.returnPressed.connect(self.test)
              


                #Eigenschaften der Buttons
                self.pB_Beenden.setEnabled(False)
                self.pB_Pause.setEnabled(False)
                self.pB_Nacharbeit.setEnabled(False)
                self.pB_Ausschuss.setEnabled(False)
                self.pB_Ersatzteil.setEnabled(False)
                
		#Eigenschaften der QLabel
                self.QL_Time.setText("TIME")
                self.QL_Date.setText("DATE")
 
                #Eigenschaften der TextEdit
                self.tE_Fertigungsauftrag.setReadOnly(True)
                self.tE_Kt.setReadOnly(True)
                self.tE_Pn.setReadOnly(True)
                self.tE_Am.setReadOnly(True)
                self.tE_Nach.setReadOnly(True)
                self.tE_Ausschuss.setReadOnly(True)
                self.tE_gE.setReadOnly(True)
                self.tE_PT.setReadOnly(True)
                self.tE_VT.setReadOnly(True)
                #Eigenschaften der LCD Zahlen
                self.lcd1.setProperty("value", 1)
                self.lcd2.setProperty("value", 2)
                self.lcd3.setProperty("value", 3)
                self.lcd4.setProperty("value", 4)
                self.lcd5.setProperty("value", 5)
                self.lcd6.setProperty("value", 6)
                self.lcd7.setProperty("value", 7)
                self.lcd8.setProperty("value", 8)
                self.lcd_ist.setProperty("value", 95)

        def onEinrichter(self):
                self.lcd1.setProperty("value", 0)
                self.lcd2.setProperty("value", 0)
                self.lcd3.setProperty("value", 0)
                self.lcd4.setProperty("value", 0)
                self.lcd5.setProperty("value", 0)
                self.lcd6.setProperty("value", 0)
                self.lcd7.setProperty("value", 0)
                self.lcd8.setProperty("value", 0)
                self.lcd_ist.setProperty("value", 0)
                
                self.step1()
                
                
        def step1(self):
                self.tE_Fertigungsauftrag.setReadOnly(False)
                self.tE_Fertigungsauftrag.setStyleSheet('background: yellow')
                self.tE_Fertigungsauftrag.setTextColor(QtGui.QColor(255,0,0))

        def test(self):
                self.tE_Fertigungsauftrag.setStyleSheet('background: red')



# Hauptprogramm***************************************************************************************************************

app = QtGui.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())

BlackJack

@opccorsa: Ich weiss nicht so recht ob ich die Frage verstanden habe. Falls Du eine Eingabemaske hast mit sagen wir mal drei Textfeldern, willst Du den Benutzer hier jetzt tatsächlich zwingen die der Reihe nach zu füllen und jedes mal mit der Eingabetaste bestätigen zu lassen damit er zum nächsten Feld gelangt, also letztendlich so etwas wie Eingaben in einem Terminal mit GUI-Eingaben nachzubasteln? Da würde ich dringend von abraten. Das widerspricht dem was der Benutzer von GUIs gewohnt ist, nämlich das er Felder in beliebiger Reihenfolge ausfüllen kann und mit der Tabulator-Taste beziehungsweise der Umschalttaste+Tabulatortaste zwischen den Feldern navigieren kann (oder welche Kombinationen auf der jeweiligen Plattform üblich sind).

Wenn man in einer GUI eine bestimmte Ausfüllreihenfolge erzwingen möchte, dann verwendet man dazu in der Regel einen „wizard”, also einen Dialog mit mehreren Seiten und Vor-/Zurück-Schaltflächen.

Anmerkung zur GUI: Nutze um Himmels willen Layouts statt der absoluten Positionierung der Elemente.
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

BlackJack hat geschrieben:@opccorsa: Ich weiss nicht so recht ob ich die Frage verstanden habe. Falls Du eine Eingabemaske hast mit sagen wir mal drei Textfeldern, willst Du den Benutzer hier jetzt tatsächlich zwingen die der Reihe nach zu füllen und jedes mal mit der Eingabetaste bestätigen zu lassen damit er zum nächsten Feld gelangt, also letztendlich so etwas wie Eingaben in einem Terminal mit GUI-Eingaben nachzubasteln? Da würde ich dringend von abraten. Das widerspricht dem was der Benutzer von GUIs gewohnt ist, nämlich das er Felder in beliebiger Reihenfolge ausfüllen kann und mit der Tabulator-Taste beziehungsweise der Umschalttaste+Tabulatortaste zwischen den Feldern navigieren kann (oder welche Kombinationen auf der jeweiligen Plattform üblich sind).
Hallo,

naja, also ich finde da nichts Verwerfliches dran. Der Anwender kann ja dann in der Regel trotzdem noch mit der Tab oder Umschalt-Tab oder Maus beliebig zwischen den einzelnen Feldern hin und her hüpfen. So wie es ihm beliebt.

Wenn man zB nur Zahlen tippen muss, finde ich persönlich es eher hinderlich, wenn man mit der rechten Hand auf dem Zahlenblock rumklimpert und dann zwischendurch mal mit der linken Hand Tab drücken muss.
Unsere derzeitiges Lohnprogramm bietet sogar extra die Möglichkeit, die Enter-Taste auf dem Zahlenblock als Tab umzufunktionieren.
Als ich bei meinem vorherigen Arbeitgeber mich mit SAP plagen musste, habe ich nach drei Monaten für 10 Dollar einen KeyMapper besorgt, wo ich die Tab-Funktion auf die Enter-Taste gelegt habe. Ab dem Zeitpunkt war SAP dann etwas komfortabler bedientbar :-)

mfg
opccorsa
User
Beiträge: 34
Registriert: Samstag 20. Juli 2013, 07:43

Danke für deine Antwort BlackJack. Das mit der geführten Eingabe muss sein, weil ein Scanner benutzt wird, der seine Eingabe immer mit Return abschließt. Deswegen wollte ich die Textfelder einfärben. Eine "Eingabemaske" Wizard wie du es genannt hast habe ich noch nichts davon gehört. Das einzige was ich gefunden habe ist die "QWizard Class Reference". Da weis ich aber immer nicht so richtig wie ich das ins Programm einbaue und wo vor allem wo. Hast du einen Tip für mich wo ich das am besten nachlesen kann. Bis jetzt habe ich immer in PyQt4 gebaut und dann ein extra Python Programm. Aber das geht ja auch ohne PyQt4, oder? Danke.
opccorsa
User
Beiträge: 34
Registriert: Samstag 20. Juli 2013, 07:43

@bfm
geht halt schneller und einfacher wenn man nur eintippt und mit Enter bestätigt

mfg
BlackJack

@bfm: Ich hatte halt den Verdacht das der Benutzer eben *nicht* mehr per Tab oder Mausklick beliebig wechseln können sollte.

@opccorsa: Wenn da tatsächlich Tastendrücke von aussen generiert werden, dann könnte man vielleicht bei den betroffenen Widgets zum Beispiel mit `installEventFilter()` ein Objekt registrieren das Tastendrücke filtert und bei der Eingabetaste diesen Tastendruck ausfiltert und stattdessen mit `nextInFocusChain()` und `setFocus()` den Eingabefokus auf das nächste Widget in der Tab-Reihenfolge setzt.
opccorsa
User
Beiträge: 34
Registriert: Samstag 20. Juli 2013, 07:43

Ich habe jetzt versucht ein EventFIlter zu installieren. Leider blicke ich da nicht wirklich durch. Da habe ich mal ein Beispiel versucht. Bekomme folgende Fehlermeldung. NameError: global name 'QEvent' is not defined eventFilter 12

Code: Alles auswählen


self.tE_Fertigungsauftrag.installEventFilter(self)
                
         def eventFilter(self, target, event):
         	print "eventFilter "+str(event.type())
         	if(event.type()==QEvent.MouseButtonPress):
         		print "Mouse was presssed "+str(event.type())
         	 	self.mousePressEvent(event) 
         	 	return True
         	 return False 
BlackJack

@opccorsa: Wo kommt den `QEvent` her? Alles was nicht „eingebaut” ist musst Du selber definieren oder aus einem anderen Modul importieren. Sonst ist es natürlich undefiniert.

Das sieht übrigens ein wenig redundant aus die `eventFilter()`-Methode zu überschreiben *und* dann das Objekt selbst als Filter für sich selbst zu registrieren.

Statt `mousePressEvent()` aufzurufen würde ich einfach auch dort `False` zurückgeben. Und wenn man das Event nicht wegfiltert sollte eine überschriebene Methode die Methode der Basisklasse aufrufen.
opccorsa
User
Beiträge: 34
Registriert: Samstag 20. Juli 2013, 07:43

Ich habe jetzt erstmal alles raus genommen. Bekomme jetzt Zahlen für das Event angezeigt. Wie bekomme ich die jetzt z.B. als "ist Enter gedrückt!" Und wie bekomme ich dann das nächste QTextEdit in ein Event ?
Einfach "self.tE_KT.installEventFilter(self)" setzen.

Code: Alles auswählen

self.tE_Fertigungsauftrag.installEventFilter(self)

	def eventFilter(self,target,event):
		print "eventFilter: "+str(event.type())
		#return True
		return False
BlackJack

@opccorsa: Also erst einmal solltest Du das mit dem Installieren von `self` sein lassen. Beziehungsweise eine eigene Klasse für diesen Filter von `QOject` Ableiten weil Du die gleiche Filteraktion ja an mehr als ein Eingabewidget binden möchtest. Also dann *dort* installieren. Dann müsste man mal schauen das das `target` auch wirklich eines der Eingabefelder ist für die Du das verhalten haben möchtest. Und von dem Objekt aus müsste man dann mit `nextInFocusChain()` und `setFocus()` den Fokus weitersetzen können. Die beiden Methoden erwähnte ich ja schon.
opccorsa
User
Beiträge: 34
Registriert: Samstag 20. Juli 2013, 07:43

Ich werde es mal versuchen. Ist ein "EingabeDialog" eventuell einfacher ? So als Popup und die Werte alle einscannen und dann bestätigen. Da würde ich auch keine Auswertung "Enter" benötigen. Jetzt wollte ich die Werte scannen und wenn "Enter" Werte prüfen und zum nächsten springen. Aber an "Popups" habe ich mich schon mal ohne Erfolg mehrere Tage vergnügt :?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Suchst Du so etwas?

Code: Alles auswählen

from PyQt4.QtGui import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton
from PyQt4.QtCore import Qt

class JumpFocusEdit(QLineEdit): pass

class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.layout = QVBoxLayout(self)
        self.inp1 = JumpFocusEdit(self)
        self.inp2 = JumpFocusEdit(self)
        self.inp3 = JumpFocusEdit(self)
        self.but = QPushButton(self)
        self.but.setText('Go!')
        self.layout.addWidget(self.inp1)
        self.layout.addWidget(self.inp2)
        self.layout.addWidget(self.inp3)
        self.layout.addWidget(self.but)
        self.setTabOrder(self.inp1, self.inp2)
        self.setTabOrder(self.inp2, self.inp3)

    def keyPressEvent(self, evt):
        active = QApplication.instance().focusWidget()
        if isinstance(active, JumpFocusEdit):
            if evt.key() in (Qt.Key_Enter, Qt.Key_Return):
                active.nextInFocusChain().setFocus()
        return QWidget.keyPressEvent(self, evt)

if __name__ == '__main__':
    app = QApplication([])
    win = Widget()
    win.show()
    app.exec_()
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

opccorsa hat geschrieben:@bfm
geht halt schneller und einfacher wenn man nur eintippt und mit Enter bestätigt

mfg
ja, ich weiß :-)
In meinen Programmen verwende ich auch grundsätzlich zusätzlich die Entertaste auf dem Ziffernblock, um auf das nächste Feld zu hüpfen. Teilweise geht es da auch im Programmablauf weiter. Daten prüfen, zusätzliche Entry-Felder zu weiteren Eingabe erstellen, Daten berechnen, in die DB schreiben....... Die rechte STRG-Taste habe ich auch zur Datenfreigabetaste wie an den alten Terminals umfunktioniert. Das gibt dann diese Ein-Hand-Bedien-Programme wie früher :-)

mfg
opccorsa
User
Beiträge: 34
Registriert: Samstag 20. Juli 2013, 07:43

@jerch - Du bist der BESTE. Danke genau das brauchte ich. Ich denke jetzt kann ich mir das hin basteln. SUPER. Danke
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Obschon die Lösung von jerch funktioniert und wenn gleich sie nur die Antwort auf deine Frage war, bricht das Konzept dieses Features jegliche Konventionen hinsichtlich Usability/UX.

Den Focus via ENTER-Taste auf das nächstfolgende Widget zu setzen, ist sehr ungewöhnlich. Die allermeisten Anwendungen halten sich da an die Tabulator-Taste. Eine Eingabe gefolgt von ENTER wird i.d.R. als Bestätigung dieser Eingabe interpretiert, die zugleich eine Aktion auslöst. (z.b. Datenfilter, Logins usw.)

Nochmal, ich sage nicht, dass der Code falsch ist, ich weise nur darauf hin, dass der Ansatz nicht den gängigen Konventionen entspricht. Meine persönliche Erfahrung ist, dass Änderungen an bestehenden UI-Konzepten einen wirklich gewichtigen Grund benötigen, anderenfalls waren und sind Nutzer schnell irritiert und der Anwendung gegenüber schneller abgeneigt.

Die Bereitschaft zur Umgewöhnung ist zumeist geringer, als man in der Rolle des Entwicklers annimmt. ;-)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Madmartigan:
Wie es scheint, triggert das Einlesegerät tatsächlich Keystrokes. Ich würde das wahrscheinlich eher ausserhalb von Qt lösen, und die gelesene Eingabe in die Zielfelder für die visuelle Rückmeldung transferieren. Dazu fehlt mir aber der Einblick in den Rest der Anwendung. Was man machen könnte - ein dezidiertes Fokusfeld, wenn der Scanner aktiv sein soll, liest die Eingabe und verteilt diese auf die Felder. Dann müsste man nicht das Standardverhalten "untergraben".
opccorsa
User
Beiträge: 34
Registriert: Samstag 20. Juli 2013, 07:43

@Madmartigan - Ist schon alles richtig was du schreibst. In meinem Fall sind "leider" die Nutzer der Software so "künstlich rückentwickelt" worden, das sie nur die 3 Stellen kennen die sie scannen müssen. Und die Reihenfolge wissen sie noch. Ein "manuelles" weiterklicken oder gar eine Tab-Taste drücken ist ausgeschlossen. Der große Überbegriff dieser Aktion heißt POKAYOKE. Dazu kommen noch Auswertung der Zeichenanzahl und unterschiedliche Zeichen in den zu scannenden Daten um richtiges Eintragen zu gewährleisten. Dahinter steht dann noch eine riesige Datenbank mit der das ganze dann nochmal auf Plausibilität geprüft wird, eh das Hauptfenster geladen wird und die Datenfelder aus der Datenbank übernommen werden.
Im großen und ganzen "Software gesteuerte Menschen" :lol:
Antworten