Ondersteuning > Programmeren

Python3 en Pyqt5 dynamisch aanmaken QLineEdit's

(1/2) > >>

BaukeP:
Hallo,

Ik heb de volgende list:

--- Code: ---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", ]
--- Einde van code ---

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
--- Code: ---cnames[x] = QlineEdit()
--- Einde van code ---
werkt niet.
Het aanmaken van de objecten gaat wel in een lus (zie hieronder), maar dan is alleen de laatste benaderbaar.

--- Code: ---namecell = QLineEdit()
                namecell.setAlignment(Qt.AlignRight)
                namecell.textChanged.connect(lambda x, pos=positions: self.my_custom_fn(x, pos))
--- Einde van code ---

Hoe kan het wel?

Alvast bedankt,
Bauke

profoX:
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?


--- Code: ---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_())

--- Einde van code ---

BaukeP:
Dankjewel!
Dit lijkt me verder te brengen.

Bauke

BaukeP:
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

profoX:
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:

--- 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));
--- Einde van code ---

Navigatie

[0] Berichtenindex

[#] Volgende pagina

Naar de volledige versie