2016-07-11 2 views
0

Я пытаюсь загрузить серные файлы, которые являются dics, а затем загружает массивы изнутри в dics в мой QTreeView, а затем сможет редактировать эти данные. У меня есть проблема, когда речь идет о подключении сигнала, когда он соединяет все кнопки с 1 данными - последний созданный. Если я загружаю 20 массивов из 1 dict, я должен иметь возможность нажимать на каждый массив и печатать его имя. Сейчас он просто печатает последнее добавленное имя.PyQT QTreeview + QPushButton/QCombobox сигналы

Вот код:

def add_data(self): 
     for subdir, dirs, files in os.walk(self.dat_folder): 
      for file_inx, file_name in enumerate(files): 
       ''' loading file ''' 
       ''' creating data''' 

       if len(data[1]) >0: 
        #file_inx = file_inx + 1 # not sure if I need this tbd. 
        job = QStandardItem(project_name) 
        self.model.setItem(file_inx,0,job) 
        self.model.setItem(file_inx, 1, QStandardItem(project_time_day+" "+project_time_time)) 
        for inx, layers in enumerate(data[1]): 
         child1 = QStandardItem(layers["Name"]) 
         child2 = QStandardItem("Push Button or Combobox or QCheckBox") 
         job.insertRow(inx,[child1, child2]) 
         b=QPushButton("TestPrint"+str(inx)) 
         b.clicked.connect(lambda: self.printData(child1.text(),layers["Name"])) 

         a = self.model.index(file_inx, 0) #find parent 
         i = a.child(inx,7) # find parented location 
         self.tv_job_list.setIndexWidget(i,b) # replace child2 with QPushButton - b 

    def printData(self,value,name): 
     print value,name 

Вот как QTreeView выглядит, каждая работа может иметь сотни job_names и могут быть сотни Job_01 и т.д. и т.п. ... Его большой список: -) 1 файл на HDD создает 1 родительский элемент, который создает дочерние задания.

Parent > JOB_01 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    ... x 1000 Childs... 


Parent > JOB_01 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    Child > Job_Name | Job_Submit_Date | QComboBox | QPushButton | QCheckBox 
    ... x 1000 Childs... 
+0

Вы переинициализировать QPushButton каждый раз, когда внутри для петель петли, так что имеет смысл, что только последний массив будет показывать. Вы переопределяете первые 19 в цикле for, поэтому кнопка подключается только к 20-му массиву. –

+0

Да, я знаю, что проблема, с которой я сталкиваюсь ... как НЕ переопределить ее? – Bobby

+0

Выньте его из цикла и вместо этого подключите кнопку к методу, который будет проходить через 'data [1]' и распечатывать данные. –

ответ

0

Использование частичного:

b = QPushButton(str(inx)) 
    b.clicked.connect(partial(self.printData,child1.text()))