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 !!!

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

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

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

Т
11 декабря 2019 г. 16:56
Тома

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
АТ
10 декабря 2019 г. 8:06
Анастасия Трощенкова

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

  • Результат:60баллов,
  • Очки рейтинга-1
АТ
10 декабря 2019 г. 8:02
Анастасия Трощенкова

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

  • Результат:73баллов,
  • Очки рейтинга1
Последние комментарии
9 декабря 2019 г. 3:41
Евгений Легоцкой

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочны…
НБ
9 декабря 2019 г. 3:36
Николай Батманов

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
9 декабря 2019 г. 3:14
Евгений Легоцкой

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
НБ
9 декабря 2019 г. 3:05
Николай Батманов

Здравствуйте! Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку: invalid use of incomplete type ‘class Ui::AnotherWindow’ ui(new Ui…
8 декабря 2019 г. 7:23
Евгений Легоцкой

У меня здесь есть одна старая статья с примером векторного редактора. Там есть ответы на ваши вопросы. Поизучайте Qt/C++ - Урок 072. Пример векторного редактора на Qt QGraphicsItem, QG…
Сейчас обсуждают на форуме
MU
11 декабря 2019 г. 8:27
Maciej Urmański

Thank you! Now works, and this is solution. num_embed = Embed.objects.filter(added_by=recipe.added_by).count()
11 декабря 2019 г. 8:12
Михаиллл

Так работает. Взял этот пример https://api-2d3d-cad.com/face_recognition_with_opencv/ void MainWindow::on_pushButton_4_clicked() //фото определение лица{ // Load Face cascade (.xml…
ТД
10 декабря 2019 г. 4:14
Тимур Досов

Спасибо, работает. А ещё вопрос: как загрузить страницу с динамической подгрузкой контента по скроллингу? Например - [https://ntvplus.ru/tv/]. Пока делаю через костыль - QApplication::s…
9 декабря 2019 г. 7:16
qml_puthon_user

Я сделал простой вывод текста по испусканию сигнала... Чего не хватает программе?) Python: # системные библиотекиimport cv2import numpy as npimport sysimport threading# PyQt б…
СК
8 декабря 2019 г. 16:11
Семен Косандяк

інтерфейс qt, приклад того додаю на малюнку, я натискаю на кнопку і у мене з'являється 2 текст лайну в які я вводжу значення, тобто в 1 цифри,у другому випадку це літери, тобто c++, без графічно…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB