Evgenii Legotckoi
Наурыз 15, 2017, 11:10 Т.Қ.

PyQt5 - Оқулық 006. QTableWidget-пен жұмыс

Мазмұны

PyQt5 жүйесінде QTableWidget-пен жұмыс істеуді бастау үшін үш баған мен бір жолдан тұратын кестені жасайық. Меңзерді кесте тақырыптарының үстіне апару қалқымалы хабарды көрсетеді. Тақырыптардағы мәтін бірінші бағанда солға, екіншісінде ортасына және үшінші бағанда оң жаққа тураланады. Сондай-ақ бағандардың өлшемі мазмұнға сәйкес реттеледі.

Кесте келесідей болады:


Іске асыру

  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, 9:37 Т.Қ.

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

Evgenii Legotckoi
  • Сәуір 21, 2019, 10:22 Т.Қ.

Через метод setIcon

  1. table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
ИШ
  • Шілде 5, 2019, 8:03 Т.Қ.

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

Evgenii Legotckoi
  • Шілде 5, 2019, 8:11 Т.Қ.

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

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

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

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

  1. table.setMinimumWidth(100)

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

b
  • Қар. 8, 2019, 6:40 Т.Қ.

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

Evgenii Legotckoi
  • Қар. 9, 2019, 4:58 Т.Қ.

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

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

b
  • Қар. 9, 2019, 7:24 Т.Қ.

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

r
  • Там. 1, 2021, 12: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 в отдельный, параллельный поток. Если процес заполнения инициализируется в разных местах программы - нужно этот класс, который будет заполнять - сделать синглтоном, в противном случае будете при вызове из разных мест программы получать ошибку доступа к памяти от чего приложение будет падать.

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз