Evgenii Legotckoi
15 марта 2017 г. 23:10

PyQt5 - Урок 006. Работа с QTableWidget

Содержание

Для первоначального знакомства с QTableWidget в PyQt5 создадим таблицу с тремя столбцами и одной строкой. При наведении курсора на заголовки таблицы будет отображаться всплывающее сообщение. Текст в заголовках будет выровнен по левому краю первого столбца, по середине — по второму и по правому краю третьего столбца. Также размер столбцов будет скорректирован в соответствии с содержимым.

Таблица будет выглядеть так:


Реализация

  1. from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QTableWidget, QTableWidgetItem
  2. from PyQt5.QtCore import QSize, Qt
  3.  
  4.  
  5. class MainWindow(QMainWindow):
  6. # Override class constructor
  7. def __init__(self):
  8. # You must call the super class method
  9. QMainWindow.__init__(self)
  10.  
  11. self.setMinimumSize(QSize(480, 80)) # Set sizes
  12. self.setWindowTitle("Работа с QTableWidget") # Set the window title
  13. central_widget = QWidget(self) # Create a central widget
  14. self.setCentralWidget(central_widget) # Install the central widget
  15.  
  16. grid_layout = QGridLayout(self) # Create QGridLayout
  17. central_widget.setLayout(grid_layout) # Set this layout in central widget
  18.  
  19. table = QTableWidget(self) # Create a table
  20. table.setColumnCount(3) #Set three columns
  21. table.setRowCount(1) # and one row
  22.  
  23. # Set the table headers
  24. table.setHorizontalHeaderLabels(["Header 1", "Header 2", "Header 3"])
  25.  
  26. #Set the tooltips to headings
  27. table.horizontalHeaderItem(0).setToolTip("Column 1 ")
  28. table.horizontalHeaderItem(1).setToolTip("Column 2 ")
  29. table.horizontalHeaderItem(2).setToolTip("Column 3 ")
  30.  
  31. # Set the alignment to the headers
  32. table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft)
  33. table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter)
  34. table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignRight)
  35.  
  36. # Fill the first line
  37. table.setItem(0, 0, QTableWidgetItem("Text in column 1"))
  38. table.setItem(0, 1, QTableWidgetItem("Text in column 2"))
  39. table.setItem(0, 2, QTableWidgetItem("Text in column 3"))
  40.  
  41. # Do the resize of the columns by content
  42. table.resizeColumnsToContents()
  43.  
  44. grid_layout.addWidget(table, 0, 0) # Adding the table to the grid
  45.  
  46.  
  47. if __name__ == "__main__":
  48. import sys
  49.  
  50. app = QApplication(sys.argv)
  51. mw = MainWindow()
  52. mw.show()
  53. sys.exit(app.exec())

Вам это нравится? Поделитесь в социальных сетях!

U
  • 18 апреля 2019 г. 21:37

А как иконку в хедер задать?

Evgenii Legotckoi
  • 21 апреля 2019 г. 22:22

Через метод setIcon

  1. table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
ИШ
  • 5 июля 2019 г. 20:03

Добрый день,а есть ли возможнось задать размер самой таблицы?

Дорый день! Если вы имеете ввиду ширину и высоту самого виджета, где располагается таблица, то это обычно делается через методы:

  • setMinimumSize
  • setMaximumSize
  • setMinimumHeight
  • setMaximumHeight
  • setMinimumWidth
  • setMaximumWidth

Исходя из своего опыта могу сказать, что обычно вся вёрстка делается через Layout классы, поэтому обычно задают минимальные размеры. А таблица уже подстраивается внутри Layout.

А в данном конкретном коде нужно вызывать данные методы так

  1. table.setMinimumWidth(100)

Спасибо большое!
Удалось ограничить размеры таблицы для своей задачи с помощью setMaximumHeight и setMaximumWidth.

b
  • 8 ноября 2019 г. 18:40

Приветствую. Подскажите пожалуйста пару моментов.
1. Как сделать столбец не редактируемый, а остальные ячейки остаются редактируемыми
2. Как оталвливать события двойного клика для редактирования ячейки и нажатия на Enter для завершения редактирования
3. Как отсортировать записи по поределенной колонке. То есть сначала загружаем таблицу, после загрузки - сортируем
Буду благодарен

Evgenii Legotckoi
  • 9 ноября 2019 г. 16:58

Добрый день.
По первым двум вопросам вы найдёте ответ в этой статье - PyQt5 - Урок 008. Работа с QTableWidget (Обновление урока 006)

Что касается последнего вопроса, то я вам советую использовать для такого функционала QTableView. QTableWidget является довольно ограниченным виджетом и подходит для табличного отображения именно виджетов с разной информацией. А для табличных данных лучше использовать можель данных и QTableView

b
  • 9 ноября 2019 г. 19:24

Спасибо Вам большое. Буду изучать.

r
  • 1 августа 2021 г. 0:04

Добрый день!
Подскажите можно ли добавлять значения/строки в таблицу в цикле или с задержкой в реальном времени, что-то типа

  1. table.setItem(1, 0, QTableWidgetItem("Text in column 1"))
  2. time.sleep(2)
  3. table.setItem(1, 1, QTableWidgetItem("Text in column 2"))
  4. time.sleep(2)
  5. table.setItem(1, 2, QTableWidgetItem("Text in column 3"))

Заренее спасибо

b
  • 1 августа 2021 г. 11:54

можно конечно. Важно понимать пару вещей.
1. Если строка именно добавляется в таблицу, нужно предварительно ее добавить в qtablewidget, для этого есть метод insertrow или как-то так - это легко гуглится
2. Если вы будете добавлять sleep ну или просто добавлять строки в цикле - то основной поток будет блокироваться на время работы цикла. Избежать блокировки можно вынеся заполнение qtablewidget в отдельный, параллельный поток. Если процес заполнения инициализируется в разных местах программы - нужно этот класс, который будет заполнять - сделать синглтоном, в противном случае будете при вызове из разных мест программы получать ошибку доступа к памяти от чего приложение будет падать.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь