Форум сайта python.su
Здравствуйте! Помогите с таким вопросом.
На форме разместил виджет QTableWidget. В него передаю содержимое загружаемого csv-файла. Соответственно, все содержимое выводится в виде таблицы. Здесь проблем нет.
Под QTableWidget находятся два ComboBox. В одном из них выбирается значения для отображения на оси X, в другом для оси Y. Для дальнейшего построения графика по значениям таблицы.
Каждый ComboBox должен отображать список из заголовков столбцов таблицы, которая выводится в QTableWidget.
Как передать этот список? Использовал конструкцию вида
spisok = self.itemFromIndex()
self.ComboBox1.addItem(spisok)
Не выходит.
Этот момент интересует в первую очередь.
А дальше надо в зависимости от выбранного индекса (названия) столбца, передать в переменные значения этих столбцов для указанного построения графика.
Желательно, чтобы во втором ComboBox скрывалось то значение, которое выбрано в первом ComboBox. Если в первом комбо выбирается другое значение, то соответственно, из второго скрывается уже оно. А предыдущее появляется.
Это для того, чтобы не был выбран один и тот же столбец для обеих осей.
Либо ничего не скрывать, но выводить предупреждающее сообщение.
Как реализовать такую функцию?
Заранее спасибо ))
Вот код для виджета QTableWidget
class MyTable(QtWidgets.QTableWidget): def __init__(self, r, c): super().__init__(r, c) self.check_change = True self.init_ui() def init_ui(self): self.cellChanged.connect(self.c_current) #self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) # Запрет редактирования таблицы self.show() def c_current(self): if self.check_change: row = self.currentRow() col = self.currentColumn() value = self.item(row, col) value = value.text() def open_sheet(self): self.check_change = False path = QtWidgets.QFileDialog.getOpenFileName(self, 'Open CSV', os.getenv('HOME'), 'CSV(*.csv)') if path[0] != '': with open(path[0], newline='', encoding="utf-8") as csv_file: self.setRowCount(0) self.setColumnCount(2) my_file = csv.reader(csv_file, delimiter=',', quotechar='|') for row_data in my_file: row = self.rowCount() self.insertRow(row) if len(row_data) > 2: self.setColumnCount(len(row_data)) for column, stuff in enumerate(row_data): item = QtWidgets.QTableWidgetItem(stuff) self.setItem(row, column, item) self.selectRow(0) self.check_change = True
Офлайн
Artur87
spisok = self.itemFromIndex()
self.ComboBox1.addItem(spisok)
Не выходит.
Этот момент интересует в первую очередь.
[code python][/code]
Офлайн
Насчет addItems я в курсе - в первом посте неправильно написал ))
А вот насчет itemFromIndex + text() приведите, пожалуйста, пример для наглядности
еще пробовал метод QTableWidget.horizontalHeaderItem
Вот так:
self.header = QtWidgets.QTableWidget.horizontalHeaderItem (self, 0)
Думал, что смогу так забрать название столбца по индексу.
Но в ответ на print(self.header) выводит None
Отредактировано Artur87 (Янв. 15, 2018 20:32:52)
Офлайн
Мне не понятно, зачем Вам передавать из комбобокса заголовки столбцов таблицы? Если у вас порядок заголовков в комбобоксе и в таблице совпадает, то данные для построения графика Вы можете достать из соответствующего столбца таблицы по индексу выбранного итема из комбобокса. На мой взгляд, итемы в комбобоксах лучше не скрывать, а делать не доступными для выбора, т.е. setEnabled(False), тогда пользователь будет видеть все варианты выбора, а не только возможные в данный момент.
Офлайн
Таблица формируется динамически из загружаемого набора данных - файла csv. Поэтому таблица всегда выходит разной, заранее заголовки не сформируешь.
Но собственно я жестко ступил )) Я хотел, чтобы заголовки набора данных “перекочевывали” в заголовки таблицы. И значения комбобокса формировались динамически из заголовков таблицы.
Хотя можно передать их напрямую из загружаемого файла ) Что сейчас и буду пытаться сделать
А передавать значения из комбобокса да, действительно, можно по индексу.
То есть проблема была в том, как привести содержимое комбо бокса в соответствие с заголовками таблицы. Об этом шла речь )
Отредактировано Artur87 (Янв. 18, 2018 13:46:26)
Офлайн