动态添加PyQt5 QPushButtons并将它们连接到不同的功能

时间:2019-01-18 07:03:07

标签: python python-3.x pyqt5

对于我正在使用PyQt5制作的GUI,我想根据表列表添加输入和按钮行以及选项卡。每个按钮需要将不同的文件加载到相应的文本框之一中,这将需要以某种方式将目标传递给函数。因为您无法定义传递给插槽的任何参数,所以我想到了一种解决方法,您可以在下面看到。后来我发现this topic,建议使用lambda函数,我认为这是一种更干净的方法。

我的问题是,我想出的解决方案(看来)是有效的代码,还是至少是好的做法。 PyQt中的事件连接到插槽,据我所知,这些插槽通常是主要QWidget的方法,但就我而言,它是连接到方法内函数内的函数。因此,建议使用我发布的方法,还是最好使用lambda函数?

from PyQt5.QtWidgets import QApplication, QWidget, QDialog, QGroupBox, QGridLayout, QHBoxLayout, QVBoxLayout, QTabWidget, QLabel, QLineEdit, QFileDialog, QPushButton

class ImportWindow(QDialog):
    def __init__(self):
        super().__init__()        
        self.initUI()

    def initUI(self):    
        self.possible_tables = ['t1', 't2', 't3', 't4']
        elements = []
        tabs = []

        grid = QGridLayout()
        tabView = QTabWidget()

        for i, t in enumerate(self.tables):
            row = [QLabel(t), QLineEdit(), QPushButton('select file')]
            elements.append(row)
            tabs.append(QWidget())
            tabView.addTab(tabs[i], t)

        for i, r in enumerate(elements):
            for j, e in enumerate(r):
                grid.addWidget(e, i, j)

        self.table_files = {}

        def get_opendial(i, t):
            def opendial():
                file = cp(QFileDialog.getOpenFileName(self, 'Open '+t+' file', self.default_folder+t+'.xlsx', 'Excel file (*.xlsx)')[0])
                elements[i][1].setText(file)
                self.table_files[t] = file
            return opendial

        for i, t in enumerate(self.possible_tables):
            elements[i][2].clicked.connect(get_opendial(i, t))

if __name__ == '__main__':
    app = 0
    app = QApplication(sys.argv)
    main_window = MainWindow()
    app.exec_()

0 个答案:

没有答案