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
|