Видео 11 QTableWidget

QTableWidget

Класс QTableWidget предоставляет основанное на элементах (item-based) табличное представление, модель для которого задана по умолчанию как (QAbstractItemModel).

Ниже привожу код, посредством которого можно инициализировать табличное представление QTableWidget с 3-мя колонками и 3-мя рядами:
  
 import sys
 from PyQt4 import QtCore, QtGui
 from PyQt4.QtGui import QApplication, QMainWindow

 class Ui_QTableWidgetWindow(object): #QTableWidget User Interface
 def setupUi(self, MainWindow):
 MainWindow.resize(450, 450) # устанавливаем размер основного окна
 self.centralWidget = QtGui.QWidget(MainWindow) # добавляем центральный виджет
 self.centralWidget.resize(400,400) # устанавливаем размер центрального виджета
 vbox = QtGui.QVBoxLayout(self.centralWidget) #Создаем вертикальное размещение
 self.TableWidget=QtGui.QTableWidget() #Инициализируем таблицу
 vbox.addWidget(self.TableWidget) #Добавляем таблицу в размещение
 self.TableWidget.setColumnCount(3) #Устанавливаем количество колонок равное 3-м для таблицы
 self.TableWidget.setRowCount(3) #Устанавливаем количество рядов равное 3-м для таблицы
 
 
Для корректной инициализации необходимо задать колличество рядов и столбцов с помощью методов setColumnCount() и setRowCount(), в дальнейшем число колонок и рядов можно будет изменить.

При помещении данных или виджетов в в таблицу QTableWidget, чтобы таблица смотрелась более информативно целесообразно добавить заголовки столбцов таблицы с помощью метода setHorizontalHeaderLabels() и заголовки рядов с помощью метода setVerticalHeaderLabels() при этом в качестве аргумента нужно передать им список заголовков.

Далее задаем класс MainWindow и основную исполняемую функцию main_application(), запускаем ее.
  
 class MainWindow(QMainWindow, Ui_QTableWidgetWindow):
 def __init__(self, parent=None, *args, **kwargs):
 QMainWindow.__init__(self)
 #Настройка основного GUI
 self.setupUi(self)

 def main_application():
 '''
 функция для инициализации и отображения основного окна приложения
 '''
 # Класс QApplication руководит управляющей логикой ГПИ и основными настройками.
 # Здеь мы создаем экземпляр класса QAplication передавая ему аргументы из коммандной строки.
 app = QApplication(sys.argv) # где sys.argv список аргументов командной строки, передаваемых сценарию Python.
 app.setStyle('cleanlooks')
 # Здсь мы создаем экземпляр класса MainWindow.
 main = MainWindow()
 main.show()
 # Метод show() отображает виджет на экране.Виджет сначала создаётся в памяти, и
 # только потом(с помощью метода show) показывается на экране.
 sys.exit(app.exec_())
 # exec_ запускает цикл обработки сообщений
 # и ждет, пока не будет вызвана exit() или не
 # будет разрушен главный виджет, и возвращает значение установленное в exit().
 # Здесь sys.exit обеспечивает чистый выход из приложения.


 #Исполнение основной функции
 if __name__ == '__main__':
 main_application()
 
 
Итак после того как мы инициализировали таблицу, мы можем работать с ней. Для того чтобы поместить строковые или символьные данные создаем с помощью QTableWidgetItem объект элемента таблицы и помещаем его в ячейку с помощью метода setItem().
  
 b = QtGui.QTableWidgetItem(str(100)) #Передача числа в объект итем Widget
 c = QtGui.QTableWidgetItem('rrr') #Передача символов в объект итем Widget
 self.TableWidget.setItem(0, 1, b) #установка экземпляра QTableWidgetItem во второй столбец первый ряд
 self.TableWidget.setItem(1, 1, c) #установка экземпляра QTableWidgetItem во второй столбец второй ряд
 
 
После этого можно задать заголовки колонок и зоголовки рядов, установить возможность сортировать данные в колонках с помощью метода setSortingEnabled(True).
  
 self.column_label =['column one', 'column tow', 'column three']
 self.row_label = ['row one', 'row tow', 'row three']
 self.TableWidget.setHorizontalHeaderLabels(self.column_label) #устанавливаем заголовки для колонок
 self.TableWidget.setVerticalHeaderLabels(self.row_label) #устанавливаем заголовки для рядов
 self.TableWidget.setSortingEnabled(True) #включаем возможность сортировки для рядов
 
 
После настройки контента таблицы можно стилизовать ее с помощю qss.
  
 style = '''
 QTableWidget::item {background-color: white;
 border-style: outset;
 border-width: 3px; border-radius: 7px; border-color: green} 

 QTableWidget::item:selected {background-color: red;
 border-width: 5px; border-radius: 7px; color: green; border-color: blue}
 '''
 # Применяем стили к основному окну программы от которого все
 # таблицы и соответственно ячейки в таблицах
 self.setStyleSheet(style)
 
 
Далее привожу несколько интересных функций для работы с таблицами:
-функции для получения зоголовков колонок и рядов таблицы QTableWidget
  
 def get_items_from_header(TableWidget):
 # Функция для получения элементов заголовков колонок QTableWidget
 headers = []
 for column in range(0, TableWidget.columnCount()): # Цикл перебора имен в шапке таблицы
 column_name = TableWidget.horizontalHeaderItem(column).text() #Получение текстового значения из заголовка колонки
 headers.append(column_name)
 return headers

 def get_items_from_row_names(TableWidget):
 # Функция для получения элементов заголовков рядов QTableWidget
 rows_names = []
 for row in range(0, TableWidget.rowCount()): # Цикл перебора имен в заголовках рядов
 row_name = TableWidget.verticalHeaderItem(row).text() #Получение текстового значения из заголовка ряда
 rows_names.append(row_name)
 return rows_names
 
 
-функции для получения списка из данных колонки, двух колонок QTableWidget по имени колонки
  
 def prepare_one_row_data(col_name, table):
 '''
 Подготовка данных одного столбца из табличного виджета QTableWidget по имени столбцов
 при возникновении ошибки функция возвращает пустой список, иначе список со значениями требуемого ряда
 '''
 column_container = [] # создаем пустой контейнер для ряда
 y = None #Изначально y не задан
 for column in range(0, table.columnCount()): #Цикл перебор имен в шапке
 column_name = table.horizontalHeaderItem(column).text()
 if column_name == col_name: #Если текст в колонке совпадает с названием требуемой колонки
 y = column #Присвоение y номера колонки
 try:
 for x in range(0, table.rowCount()): # перебираем ряды добовляя значения колонки с индексом y в список
 column_container.append(table.item(x, y).text())
 return column_container
 except:
 return column_container

 def prepare_two_row_data(x_col_name, y_col_name, table):
 '''
 Подготовка данных двух столбцов из табличного виджета QTableWidget по имени столбцов
 при возникновении ошибки функция возвращает пустой список иначе список со значениями требуемого ряда
 '''
 column_one_container = []
 column_two_container = []
 y = None #Изначально y не задан
 z = None #Изначально z не задан
 for column in range(0, table.columnCount()): #Цикл перебор имен в шапке
 column_name = table.horizontalHeaderItem(column).text()
 if column_name == x_col_name: #Если текст в колонке совпадает с названием требуемой колонки для переменной x
 y = column #Присвоение номера колонки переменной y
 if column_name == y_col_name: #Если текст в колонке совпадает с названием требуемой колонки для переменной y
 z = column #Присвоение номера колонки переменной z
 try:
 for x in range(0, table.rowCount()): # перебираем ряды добовляя значения колонки с индексом y в список
 column_one_container.append(table.item(x, y).text())
 for x in range(0, table.rowCount()): # перебираем ряды добовляя значения колонки с индексом z в список
 column_two_container.append(table.item(x, z).text())
 return column_one_container, column_two_container
 except:
 return column_one_container, column_two_container