对于我正在使用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_()