PyQt5 - Урок 008. Работа с QTableWidget (Обновление урока 006)

QTableWidget, PyQt5

Содержание

Это будет небольшое обновление урока по использованию QTableWidget в PyQt5

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

Приложение будет выглядеть следующим образом

Введение

Данное дополнение сделано по просьбе одного изпользователей. В частности добавления отслеживания клавиш и настройка редактирования ячеек.

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

А теперь вернёимся к примеру.

widgets.py

Сначала нужно создать кастомный QTableWidget

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeyEvent
from PyQt5.QtWidgets import QTableWidget


# Мы создаем собственный QTableWidget для реагирования на события нажатия клавиш
class CustomTableWidget(QTableWidget):

    # переопределяем keyPressEvent
    def keyPressEvent(self, e: QKeyEvent) -> None:
        if e.key() == Qt.Key_Enter:
            print("Key enter was pressed")
        elif e.key() == Qt.Key_Return:
            print("Key return was pressed")

init .py

А далее будем создавать окно приложения

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

from widgets import CustomTableWidget


# Наследование от QMainWindow
class MainWindow(QMainWindow):
    # Overriding the class constructor
    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 = CustomTableWidget(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, self.createItem("Text in column 1", Qt.ItemIsSelectable | Qt.ItemIsEnabled))
        table.setItem(0, 1, self.createItem("Text in column 2", Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable))
        table.setItem(0, 2, self.createItem("Text in column 3", Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable))

        # изменить размер столбца по содержимому
        table.resizeColumnsToContents()

        grid_layout.addWidget(table, 0, 0)  # Add a table to the grid

    def createItem(self, text, flags):
        tableWidgetItem = QTableWidgetItem(text)
        tableWidgetItem.setFlags(flags)
        return tableWidgetItem


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())

Заключение

Код данного проекта вы найдёте в репозитории примеров. Не забудьте поставить звёздочку репозиторию.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
- блог компании
Поддержать автора Donate
b

спасибо ещё раз. огромное, за уделённое время

Комментарии

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

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

v
9 апреля 2020 г. 5:41
vitalisimys

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

  • Результат:21баллов,
  • Очки рейтинга-10
v
9 апреля 2020 г. 5:36
vitalisimys

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:40баллов,
  • Очки рейтинга-8
v
9 апреля 2020 г. 5:32
vitalisimys

C++ - Тест 001. Первая программа и типы данных

  • Результат:53баллов,
  • Очки рейтинга-4
Последние комментарии
8 апреля 2020 г. 9:12
ogustbiller

Круто! Немного начинает проясняться что к чему. Спасибо.
K
7 апреля 2020 г. 8:55
KULINAR847

А вот уже и на python... #!/usr/bin/env python# -'''- coding: utf-8 -'''-import sysfrom PySide2.QtWidgets import *from PySide2.QtQuick import *from PySide2.QtCore import *from PySide2.…
3 апреля 2020 г. 8:06
Konstantin Grudnitskiy

Я надеюсь вы уже разобрались в чем дело, но если вдруг нет, то проблема состоит в том, что вы пытаетесь запустить программу из интерпретатора питона. Файл main.py это уже готова…
3 апреля 2020 г. 6:18
Konstantin Grudnitskiy

>>> text = 'hello world'>>> ' '.join(word for word in text.split()[:-1])'hello'>>> def remove_last_word(text):... return text and ' '.join(word for word in text.s…
27 марта 2020 г. 14:40
Евгений Легоцкой

Добрый день. В конце пятой статьи скачать можете.
Сейчас обсуждают на форуме
ДК
9 апреля 2020 г. 3:31
Джон Кофи

Привет. Делаю реализацию перемещения строк на QTableView с моделью QSqlTableModel. Буду в этой теме спрашивать нужное. Пока такой вопрос при создании модели: как мне узнать rowCount? int…
8 апреля 2020 г. 17:42
elyana

Подскажите как правильно реализовать... Нужно создать массив в C++ с переменными типа сhar или же int. В Qml будет переменная, например text, которая будет изменять своё значение в зависим…
ДК
8 апреля 2020 г. 6:29
Джон Кофи

:-D блин, без слов, пойду пройдусь))
s
8 апреля 2020 г. 4:59
slava_d2000

Всем привет. Прошу помощи.есть статическая сборка 5.14.2 (без SSL) компилируется чистый шаблон на QML и Widgets если войти на компьютер в терминальной сессии и запустить программ…
s
6 апреля 2020 г. 8:06
shuric

Добрый день. Объясните пожалуйста ... ... допиливать стилевое оформление в прокси классе ... где именно копать ? В каком виртуальном методе лучше допиливать (если можно н…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB