Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's  (gelezen 5158 keer)

Offline BaukeP

  • Lid
Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Gepost op: 2019/06/12, 18:45:12 »
Hallo,

Ik heb de volgende list:
cnames = ["c00", "c01","c02", "c03", "c04", "c05",
                 "c10", "c11", "c12", "c13", "c14", "c15",
                 "c20", "c21", "c22", "c23", "c24", "c25",
                 "c30", "c31", "c32", "c33", "c34", "c35",
                 "c40", "c41", "c42", "c43", "c44", "c45",
                 "c50", "c51", "c52", "c53", "c54", "c55",
                 "c60", "c61", "c62", "c63", "c64", "c65",
                 "c70", "c71", "c72", "c73", "c74", "c75", ]

M.b.v. deze list (celcoordinaten) wil ik voor ieder item een QLineEdit object aanmaken, welk ik later kan benaderen met:
c00.setText("tekst").

Maar een loop met cnames[x] = QlineEdit() werkt niet.
Het aanmaken van de objecten gaat wel in een lus (zie hieronder), maar dan is alleen de laatste benaderbaar.
namecell = QLineEdit()
                namecell.setAlignment(Qt.AlignRight)
                namecell.textChanged.connect(lambda x, pos=positions: self.my_custom_fn(x, pos))

Hoe kan het wel?

Alvast bedankt,
Bauke
« Laatst bewerkt op: 2019/06/12, 18:50:08 door BaukeP »

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #1 Gepost op: 2019/06/24, 03:16:13 »
Ik weet niet juist wat je probeert te doen, maar hier is een volledig voorbeeld op basis van PySide2 (Qt 5) om op basis van die array een grid met QLineEdit elementen te maken en waar we de setText() functie gebruiken. Daarnaast wordt er een label bijgewerkt zodra één van de QLineEdit elementen wordt aangepast. Ben je daar iets mee?

from PySide2.QtWidgets import QApplication, QDialog, QGridLayout, QLabel, QLineEdit
import sys

cnames = ["c00", "c01","c02", "c03", "c04", "c05",
    "c10", "c11", "c12", "c13", "c14", "c15",
    "c20", "c21", "c22", "c23", "c24", "c25",
    "c30", "c31", "c32", "c33", "c34", "c35",
    "c40", "c41", "c42", "c43", "c44", "c45",
    "c50", "c51", "c52", "c53", "c54", "c55",
    "c60", "c61", "c62", "c63", "c64", "c65",
    "c70", "c71", "c72", "c73", "c74", "c75"]

class Dialog(QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setWindowTitle("Application name")

        # Create grid layout
        self.grid = QGridLayout()
        self.setLayout(self.grid)

        # Add label to test signal/slot of line edits
        self.label = QLabel()
        self.label.setText("Change something...")
        self.grid.addWidget(self.label, 0, 0)

        # Create the different line edits based on cnames
        # And add it to a grid layout
        self.lineEdits = {}
        for cname in cnames:
            row = int(cname[1])
            col = int(cname[2])
            lineEdit = QLineEdit()
            lineEdit.setText("Test " + cname)
            lineEdit.textChanged.connect(self.updateLabel)
            self.grid.addWidget(lineEdit, row + 1, col)
            self.lineEdits[cname] = lineEdit

    def updateLabel(self, text):
        self.label.setText("Updated to: " + text)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog = Dialog()
    dialog.show()
    sys.exit(app.exec_())
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline BaukeP

  • Lid
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #2 Gepost op: 2019/07/02, 14:48:08 »
Dankjewel!
Dit lijkt me verder te brengen.

Bauke

Offline BaukeP

  • Lid
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #3 Gepost op: 2019/07/03, 13:28:52 »
Ter verduidelijking:

Ik wil in  row 2, col 2 (c22) een getal invoeren. Op basis van dat getal (en andere gegevens) wil ik de uitkomsten van berekeningen in de cellen (LineEdits) c23, c24 en c25 zetten.

Hoe doe ik dat? Ik dacht aan QLineEdit.setText(row, col, "uitkomst"), maar dat werkt niet.

Alvast bedankt voor je hulp

Bauke

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #4 Gepost op: 2019/07/03, 14:14:42 »
Dag BaukeP

Dat werkt niet, want QLineEdit is 1 object en 1 line edit. Het is geen grid component ofzo. Daarom kan je ook niet over rijen of kolommen spreken op een QLineEdit. Je hebt zelf een grid ontworpen op basis van de QLineEdit objecten.

Dus om een QLineEdit te targeten moet je gebruik maken van je eigen structuur (de cnames dictionary) (ofwel van de QGridLayout dat kan in principe ook..)

Voorbeeld aangepast aan mijn eerdere code:
    def updateLabel(self, text):
        self.lineEdits["c23"].setText(str(float(self.lineEdits["c22"].text()) * 2));
        self.lineEdits["c24"].setText(str(float(self.lineEdits["c22"].text()) * 3));
        self.lineEdits["c25"].setText(str(float(self.lineEdits["c22"].text()) * 4));
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline BaukeP

  • Lid
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #5 Gepost op: 2019/07/03, 15:20:05 »
Dankjewel! En bovendien razendsnel!

Ik ga er weer verder mee.

Bauke

Offline BaukeP

  • Lid
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #6 Gepost op: 2019/07/06, 21:36:33 »
Het wordt steeds mooier!

Maar ik loop nu weer tegen iets aan waar ik zo even geen oplossing voor zie:
De invoervelden (waar na invullen de berekeningen in de kolommen erna keurig worden gedaan) veranderen slecht zelden. De gegevens waarop de berekeningen zijn gebaseerd, veel vaker. Het probleem is nu dat er zonder wijziging van de invoervelden niet wordt herberekend.
Ik heb geprobeerd, de bestaande waarden opnieuw in de betreffende invoervelden te zetten, maar dat wordt dus niet gezien als een verandering en er wordt dus niet doorgerekend.

Ik heb voor het doorrekenen een 'refresh'-knop gemaakt, die keurig de nieuwe gegevens van internet plukt, maar vervolgens niet alles weer doorrekent.

Hoe pak ik dit aan? (profoX?)

Alvast weer bedankt,
Bauke

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #7 Gepost op: 2019/07/06, 22:38:10 »
Gewoon de functie die de berekeningen doet uitvoeren wanneer de Refresh knop wordt gebruikt nadat de berekeningen vanaf internet zijn bijgewerkt. In mijn eerdere voorbeeld dus de 'updateLabel' functie.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline BaukeP

  • Lid
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #8 Gepost op: 2019/07/06, 23:31:51 »
Precies ..... En dat probeerde ik ook.

Zal er morgenvroeg met een verse blik weer even naar kijken. Kan zomaar een komma of punt foutje zijn.
Bedankt! Ik weet nu dat ik op de goeie weg zit.

Bauke

Offline BaukeP

  • Lid
Re: Python3 en Pyqt5 dynamisch aanmaken QLineEdit's
« Reactie #9 Gepost op: 2019/07/20, 22:26:37 »
profoX bedankt. Ik heb het werkend.

Bauke