Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для svd_sergey
1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 94
PyQt5

Неверная сортировка в столбце QTableView

14.12.2021, 15:18. Показов 3861. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый день.
Необходима помощь с таблицей QTableView. Столбец 2 содержит числа типа str (при вставке в TableView типа int остаются пустые ячейки). При нажатии на заголовок столбца 2 производится сортировка по строке. В итоге сортированный столбец выглядит примерно так:
0
1
10
100
2
30
400
5

Как сделать правильную сортировку чисел?
Пример наполнения таблицы ниже.
Python
1
2
3
4
5
6
7
model = QStandardItemModel(0,3)
model.setHorizontalHeaderLabels(['1', '2', '3'])
tableView.setModel(model)
tableView.setSortingEnabled(True)
 
for row in rows:
   model.appendRow([QStandardItem(row[0]), QStandardItem(str(row[1])), QStandardItem(row[2])])
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2021, 15:18
Ответы с готовыми решениями:

Делегат перекрашивания строки по условию в столбце QTableView
Всем привет. У меня есть вот такой делегат, который по условию в колонке перекрашивает ячейку 26 или 27 колонки в красный цвет. ...

Неверная сортировка массива
Задача: отсортировать по возрастанию два массива, объединить их в один, уже по возрастанию. Проблемы начинаются с сортировки 2 массива:...

Неверная сортировка в Access
Кто-ни встречал в Access такой эффект: При создании таблицы с сортировкой сортировка не проходит правильно; при повторении но уже с...

4
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
17.12.2021, 12:54
Советую прочитать https://habr.com/ru/post/171443/
Да, я понимаю, что это не ответ на ваш вопрос, но тем не менее.
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
18.12.2021, 10:48
Лучший ответ Сообщение было отмечено svd_sergey как решение

Решение

Наверное, можно и таким сермяжным способом
Python
1
2
3
4
5
6
7
model = QStandardItemModel(0,3)
model.setHorizontalHeaderLabels(['1', '2', '3'])
tableView.setModel(model)
tableView.setSortingEnabled(True)
 
for row in rows:
   model.appendRow([QStandardItem(row[0]), QStandardItem(' '*9+str(row[1])[-9:]), QStandardItem(row[2])])
А если по уму, то наверное, надо бы QSortFilterProxyModel запользовать, например, как советует JonB:
So simplest is: subclass QSortFilterProxyModel, and use your class, so that we can override lessThan(), which is what is called by Qt to do sorting.
вот тут https://forum.qt.io/topic/1187... temmodel/4

Добавлено через 19 минут
Пардон, опечаточка вышла. Вместо:
Python
1
QStandardItem(' '*9+str(row[1])[-9:])
надо
Python
1
QStandardItem((' '*9+str(1234))[-9:])
Добавлено через 14 минут
Python
1
QStandardItem((' '*9+str(row[1]))[-9:])
1
 Аватар для svd_sergey
1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 94
22.12.2021, 08:11  [ТС]
Спасибо, сделал по Вашему совету.
Python
1
QStandardItem((' '*9+str(row[1]))[-9:])
А как перегрузить оператор lessThan() на python не смог разобраться.
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
24.12.2021, 19:13
Лучший ответ Сообщение было отмечено svd_sergey как решение

Решение

Немножко поздновато, но вдруг ещё актуально. В питоне то, что предлагает JonB, можно так изобразить:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
 
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QTableView
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtCore import QSortFilterProxyModel
 
class MySortFilterProxyModel(QSortFilterProxyModel):
    def lessThan(self, source_left, source_right):
        if (source_left.isValid() and source_right.isValid()):
            if (source_left.column() == 1):    # <== номер колонки с числами
                return int(source_left.data()) < int(source_right.data())
        return super(MySortFilterProxyModel, self).lessThan(source_left, source_right)
 
class Window(QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.setGeometry(300, 200, 500, 400)
 
        w_view = QTableView(self)
        w_model = QStandardItemModel(self)
        w_model.setHorizontalHeaderLabels(['Деталь', 'Длина', 'Поставщик'])
        w_proxy = MySortFilterProxyModel(self)
        w_proxy.setSourceModel(w_model)
        w_view.setModel(w_proxy)
        w_view.setSortingEnabled(True)
 
        rows = [['Стойка', 200, 'Фабрика'],
                ['Штанга', 10, 'Завод'],
                ['Перекладина', 5, 'Мастерская']
               ]
 
        for row in rows:
            w_model.appendRow([QStandardItem(row[0]),
                               QStandardItem(str(row[1])),
                               QStandardItem(row[2])])
        self.setCentralWidget(w_view)
 
myapp = QApplication(sys.argv)
window = Window()
window.show()
 
myapp.exec_()
sys.exit()
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2021, 19:13
Помогаю со студенческими работами здесь

Qtableview сортировка
Приветствую, форумчане. Такая загвоздочка. Есть qtableview в который я забиваю данные из базы пост грии. Включаю сортировку...

Сортировка в QTableView
Есть таблица, которая ниже на скрине. Как при нажатии на заголовок стобца (пр. Фамилия) отсортировать все строки по фамилии?

QTableView сортировка и выделение
Приветствую всех любителей С++ и Qt в частности. Есть QTableView с моделью QSqlTableModel. В QTableView сортировка включена....

qtableview не работает сортировка по столбцу
QString Year = QDate::fromString(ui-&gt;lineEdit_grupp_do-&gt;text(),&quot;yyyy&quot;).toString(&quot;yyyy&quot;); if (Year !=&quot;&quot;){ model_vse_grupp = new...

Сортировка по двум столбцам в QTableView, используя QSqlRelationalTableModel
Здравствуйте! Имеется таблица, сортирую ее по первому столбцу. Но хотелось бы отсортировать по двум столбцам (сначала по первому, а потом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru