سؤال

أنا أستخدم QT4.5.2 على Linux. لديّ QTableWidget بسيطة ، حيث يعرض العمود تواريخ بتنسيق صديق للإنسان. لسوء الحظ ، ليس من السهل فرز "التواريخ الصديقة للإنسان" بشكل صحيح. لذلك ، في QTableWidget أحتفظ بعمود مخفي مع طابع الطابع الطابع UNIX يتوافق مع ذلك التاريخ.

أحاول التأكد من أنه كلما تم إصدار طلب للفرز على عمود التاريخ ، في الواقع يتم إجراء النوع على عمود الطابع الزمني (غير المرئي). حاولت إعادة تنفيذ SortByColumn (هذا في بيثون) عن طريق التصنيف الفرعي من QTableWidget والتعريف:

   def sortByColumn(self, col, order):
       print 'got request to sort col %d in order %s' % (col, str(order) )

ومع ذلك ، كلما قمت بالنقر فوق أحد رؤوس الجدول الخاص بي ، تستمر استدعاء طريقة الفرز العادي.

كيف يمكنني تجاوزه؟

هل كانت مفيدة؟

المحلول

يمكنك استخلاص فصلك الخاص QTableWidgetItem ثم اكتب بنفسك __lt__ المشغل أو العامل. هذا من شأنه أن يخفف من الحاجة إلى عمود إضافي كذلك. شيء على غرار:

from PyQt4 import QtCore, QtGui
import sys
import datetime

class MyTableWidgetItem(QtGui.QTableWidgetItem):
    def __init__(self, text, sortKey):
        #call custom constructor with UserType item type
        QtGui.QTableWidgetItem.__init__(self, text, QtGui.QTableWidgetItem.UserType)
        self.sortKey = sortKey

    #Qt uses a simple < check for sorting items, override this to use the sortKey
    def __lt__(self, other):
        return self.sortKey < other.sortKey

app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.setGeometry(0, 0, 400, 400)

table = QtGui.QTableWidget(window)
table.setGeometry(0, 0, 400, 400)
table.setRowCount(3)
table.setColumnCount(1)

date1 = datetime.date.today()
date2 = datetime.date.today() + datetime.timedelta(days=1)
date3 = datetime.date.today() + datetime.timedelta(days=2)

item1 = MyTableWidgetItem(str(date1.strftime("%A %d. %B %Y")), str(date1))
item2 = MyTableWidgetItem(str(date2.strftime("%A %d. %B %Y")), str(date2))
item3 = MyTableWidgetItem(str(date3.strftime("%A %d. %B %Y")), str(date3))

table.setItem(0, 0, item1)
table.setItem(2, 0, item2)
table.setItem(1, 0, item3)
table.setSortingEnabled(True)

window.show()
sys.exit(app.exec_())

أنتج هذا النتائج الصحيحة بالنسبة لي ، يمكنك تشغيله بنفسك للتحقق. يعرض نص الخلية نصًا مثل "Saturday 20. February 2010" ولكن عندما تقوم بفرز العمود ، سيتم فرزه بشكل صحيح عن طريق sortKey الحقل وهو "2010-02-20" (تنسيق ISO).

أوه، تجدر الإشارة أيضًا إلى أن هذا لن يعمل مع بيسايد لأنه يبدو أن __lt__ المشغل غير ملزم ، حيث هو مع PYQT4. قضيت بعض الوقت في محاولة لتصحيح سبب عدم عمله ، ثم تحولت من بيسايد إلى PYQT4 وعملت بشكل جيد. قد تلاحظ أن ال __lt__ غير مدرج هنا:

http://www.pyside.org/docs/pyside/pyside/qtgui/QtableWidgetItem.html

لكنها هنا:

http://doc.qt.digia.com/4.5/qtableWidgetItem.html#Operator-lt

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top