Evgenii Legotckoi
Evgenii Legotckoi15 березня 2017 р. 13:10

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

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

Виглядати таблиця буде наступним чином:


Реалізація

from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import QSize, Qt


# Наслідуючи від QMainWindow
class MainWindow(QMainWindow):
    # Перевизначити конструктор класу
    def __init__(self):
        # Обов'язково потрібно викликати метод суперкласу
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(480, 80))             # встановлюємо розміри
        self.setWindowTitle("Робота з QTableWidget")    # Встановлюємо заголовок вікна
        central_widget = QWidget(self)                  # Створюємо центральний віджет
        self.setCentralWidget(central_widget)           # Встановлюємо центральний віджет

        grid_layout = QGridLayout()             # створюємо QGridLayout
        central_widget.setLayout(grid_layout)   # Встановлюємо дане розміщення в центральний віджет

        table = QTableWidget(self)  # створюємо таблицю
        table.setColumnCount(3)     # Встановлюємо три колонки
        table.setRowCount(1)        # і один рядок в таблиці

        # Встановлюємо заголовки таблиці
        table.setHorizontalHeaderLabels(["Header 1", "Header 2", "Header 3"])

        # Встановлюємо спливаючі підказки на заголовки
        table.horizontalHeaderItem(0).setToolTip("Column 1 ")
        table.horizontalHeaderItem(1).setToolTip("Column 2 ")
        table.horizontalHeaderItem(2).setToolTip("Column 3 ")

        # Встановлюємо вирівнювання на заголовки
        table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft)
        table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter)
        table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignRight)

        # заповнюємо перший рядок
        table.setItem(0, 0, QTableWidgetItem("Text in column 1"))
        table.setItem(0, 1, QTableWidgetItem("Text in column 2"))
        table.setItem(0, 2, QTableWidgetItem("Text in column 3"))

        # робимо ресайз колонок по вмісту
        table.resizeColumnsToContents()

        grid_layout.addWidget(table, 0, 0)   # Додаємо таблицю в сітку


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

U
  • 18 квітня 2019 р. 11:37

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

Evgenii Legotckoi
  • 21 квітня 2019 р. 12:22

Через метод setIcon

table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
ИШ
  • 05 липня 2019 р. 10:03

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

Evgenii Legotckoi
  • 05 липня 2019 р. 10:11

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

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

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

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

table.setMinimumWidth(100)

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

b
  • 08 листопада 2019 р. 07:40

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

Evgenii Legotckoi
  • 09 листопада 2019 р. 05:58

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

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

b
  • 09 листопада 2019 р. 08:24

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

r
  • 31 липня 2021 р. 14:04

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

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

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

b
  • 01 серпня 2021 р. 01:54

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:84бали,
  • Рейтинг балів4
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:42бали,
  • Рейтинг балів-8
ОК

Qt - Тест 001. Сигналы и слоты

  • Результат:47бали,
  • Рейтинг балів-6
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Дмитрий
Дмитрий03 лютого 2025 р. 06:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo Wai30 січня 2025 р. 09:22
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nkly03 січня 2025 р. 02:52
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
Marsel16 серпня 2023 р. 14:26
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.

Слідкуйте за нами в соціальних мережах