connect pushbuttons to lineedits

Question:

I have a problem with my python code, it’s a QTablewidget with Qpushbuttons and Qline_edits inside each cell, We want a file path (after selecting this file from the file browser) to be written in the line edit when we click on its pushbutton and to store the output files so we can use them after.

from PyQt5.QtWidgets import (
    QMainWindow,
    QApplication,
    QPushButton,
    QFileDialog,
    QGridLayout,
    QLineEdit,
    QTableWidget,
    QHBoxLayout,
    QWidget,
)
from PyQt5.QtCore import pyqtSlot
import sys
from functools import partial
global list_C
list_C=[]
class boxlayout(QWidget):
    def __init__(self):
        super(boxlayout,self).__init__()
        layout=QHBoxLayout()
        layout.setContentsMargins(0,0,0,0)
        layout.setSpacing(0)
        boxlayout.le=QLineEdit()
        boxlayout.btn=QPushButton()
        layout.addWidget(boxlayout.le)
        layout.addWidget(boxlayout.btn)
        self.setLayout(layout)

class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)
        mainlayout = QGridLayout(centralWidget)
        self.table = QTableWidget(self)
        self.table.resize(640, 480)
        self.table.setColumnCount(3)
        self.table.setRowCount(4)
        mainlayout.addWidget(self.table)
        save_button=QPushButton('OK')
        mainlayout.addWidget(save_button)
        save_button.clicked.connect(self.save_as_list)
        for i in range(4):
            for j in range(3):
                self.table.setCellWidget(i,j, boxlayout())
                boxlayout.btn.clicked.connect(partial(self.open_dialog, boxlayout.le))


    @pyqtSlot(QLineEdit)
    def open_dialog(self, le: QLineEdit):
        file_name = QFileDialog.getOpenFileName(
            self,
            "Open File",
            "${HOME}",
            "All Files (*)",
        )
        le.setText(file_name[0])

    def save_as_list(self):
        for i in range(4):
            for j in range(3):
                item=self.table.cellWidget(i,j).le.text()
                list_C.append(item)  
        print(list_C)   #output=['last le value','last le value',...]


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_gui = Main()
    main_gui.show()
    sys.exit(app.exec())
Asked By: mc159753

||

Answers:

Here is a minimal example:

from PyQt5.QtWidgets import (
    QMainWindow,
    QApplication,
    QPushButton,
    QFileDialog,
    QFrame,
    QGridLayout,
    QLineEdit,
)
from PyQt5.QtCore import pyqtSlot
import sys
from functools import partial

class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        top_frame = QFrame(self)
        self.setCentralWidget(top_frame)
        self.grid = QGridLayout(top_frame)
        for i in range(10):
            btn = QPushButton(top_frame)
            le = QLineEdit(top_frame)
            btn.clicked.connect(partial(self.open_dialog, le))
            btn.setText("open file system dialog")
            self.grid.addWidget(btn, i, 0)
            self.grid.addWidget(le, i, 1)

    @pyqtSlot(QLineEdit)
    def open_dialog(self, le: QLineEdit):
        file_name = QFileDialog.getOpenFileName(
            self,
            "Open File",
            "${HOME}",
            "All Files (*)",
        )
        le.setText(file_name[0])


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_gui = Main()
    main_gui.show()
    sys.exit(app.exec())

The key thing here is to pass the QLineEdit to the file selector method.
Here we are doing it with: lambda: self.open_dialog(le)

Answered By: ניר
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.