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

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

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

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

БМ
25 января 2020 г. 13:16
Бекзод Муминов

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

  • Результат:53баллов,
  • Очки рейтинга-4
БМ
25 января 2020 г. 13:04
Бекзод Муминов

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

  • Результат:20баллов,
  • Очки рейтинга-10
БМ
25 января 2020 г. 12:52
Бекзод Муминов

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

  • Результат:42баллов,
  • Очки рейтинга-8
Последние комментарии
27 января 2020 г. 1:01
Ruslan Polupan

Да так, посмотрел библиотеку попробовал примеры...
s
26 января 2020 г. 14:51
shame

Чего не webassembly?
21 января 2020 г. 14:12
Docent

Полезная статья. Как всегда - то что надо. Добавлю ещё маленькую полезность - после установки tracer (88 строка) и перед выводом значений в lineEdit (91 строка) стоит добавить updatePositio…
17 января 2020 г. 2:31
Андрей Янкович

Выглядит как ошибка библиотеки. Расскажите подробно на какой платформе вы собираете проект (MinGW или MSVC) их версии и версии Qt.
D
16 января 2020 г. 12:06
DENIZ1819

Доброго времени суток, не подскажите, что делать в данной ситуации, после того, как я сделал все вышеуказанные инструкции для подключения библиотеки к проекту?
Сейчас обсуждают на форуме
27 января 2020 г. 3:17
Илья Чичак

а почему бы не сделать одну модель, например Attachement со всеми этими полями, и в зависимости от действия пользователя, например, "добавить документ", "добавить картинку" и т.д. класть все это…
E
26 января 2020 г. 11:42
Edi

Другого способа, как получать перезагруженный контент через JavaScript на странице, я не знаю. Получилось сделать без QWebEngineView, с помощью QWebEnginePage, runJavaScrip…
E
26 января 2020 г. 11:14
Edi

Да, я не понял до конца того, как это работает, мало опыта работы с qt и QVAriant ни разу не использовал. Спасибо за помощь)
VZ
26 января 2020 г. 4:11
Vladimir Zhitkovsky

Да, спасибо порешалось таким образом: удаление одного for(int i = 0; i < lstData.count(); ++i){ auto *data= dynamic_cast<Data*>(lstData[i]); if(data) { if(…
14 января 2020 г. 9:04
Руслан Волшебник

Проблема осталась. Но я выснил, что это происходит когда файл достигает максимального размера.
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB