Лучший способ сортировки шестнадцатеричных чисел внутри QTableWidget - PullRequest
1 голос
/ 09 июля 2019

Я хочу знать лучший способ сортировки шестнадцатеричных чисел внутри QTableWidget.

В настоящее время я конвертирую все шестнадцатеричные значения и сортирую их по возрастанию / убыванию. Но моя проблема в том, что я преобразовал его в десятичную. Значения, указанные в таблице, указаны в десятичном формате. Я хочу отсортировать шестнадцатеричное без изменения значения, указанного в таблице

Вот моя текущая реализация:

from PySide2.QtCore import Qt
from PySide2.QtWidgets import QTableWidget

class NumericData(QTableWidgetItem):
    def __lt__(self, other):
        return (self.data(Qt.UserRole) < other.data(Qt.UserRole))

class Window(QTableWidget):
    def __init__(self):
        super(Window, self).__init__(4, 2)
        for column, values in enumerate((
            ('ABCD', '1DCA', 'BD23', 'FFFFFFFF'),
            (1,2,3,4)
            )):
            for row, value in enumerate(values):
                if column == 0:
                    value = str(int(value, 16))
                else:
                    value = str(value)
                item = NumericData(value)
                item.setData(Qt.UserRole, value)
                self.setItem(row, column, item)
        self.setSortingEnabled(True)
        self.sortItems(0, Qt.AscendingOrder)

Вот пример таблицы

|--Values--|
|ABCD      |
|1BCD      |
|DEC1      |
|123       |
|2105      |
|AAAAAAAA  |

1 Ответ

1 голос
/ 09 июля 2019

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

Учитывая это, я реализовал следующий пример:

from PySide2 import QtCore, QtGui, QtWidgets


class HexDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        editor = QtWidgets.QSpinBox(parent)
        editor.setMaximum(2147483647)
        editor.setMinimum(-2147483647 - 1)
        editor.setDisplayIntegerBase(16)
        fnt = editor.font()
        fnt.setCapitalization(QtGui.QFont.AllUppercase)
        editor.setFont(fnt)
        return editor

    def setEditorData(self, editor, index):
        editor.setValue(int(index.data(QtCore.Qt.DisplayRole), 16))

    def setModelData(self, editor, model, index):
        value = ('{:x}'.format(editor.value())).upper()
        model.setData(index, value, QtCore.Qt.DisplayRole)


class NumericData(QtWidgets.QTableWidgetItem):
    def __lt__(self, other):
        return int(self.data(QtCore.Qt.DisplayRole), 16) < int(
            other.data(QtCore.Qt.DisplayRole), 16
        )


class Window(QtWidgets.QTableWidget):
    def __init__(self):
        super(Window, self).__init__(4, 2)
        delegate = HexDelegate(self)
        self.setItemDelegateForColumn(0, delegate)
        data = ("ABCD", "1DCA", "BD23", "FFFF"), (1, 2, 3, 4)
        for row, values in enumerate(zip(*data)):
            for col, value in enumerate(values):
                it = QtWidgets.QTableWidgetItem()
                it.setData(QtCore.Qt.DisplayRole, value)
                self.setItem(row, col, it)
        self.setSortingEnabled(True)
        self.sortItems(0, QtCore.Qt.AscendingOrder)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())
...