سؤال

في لQTableWidget أريد لعرض كافة القيم فقط مع اثنين من الكسور العشرية الأماكن. لذلك أنا subclassed QTableWidgetItem.

class MyCell(QTableWidgetItem):
    def __init__(self, *args):
        QTableWidgetItem.__init__(self, *args)

    def clone(self):
        return MyCell()

    def data(self, role):
        t = QTableWidgetItem(self).data(role)
        if role == 0:
            if t.type() != 0:
                try:
                    a, b = str(t.toString()).split('.')
                    return QVariant( ".".join([a,b[:2]]))
                except:
                    return t
         return t

وقرأت الوثائق وأفكر أنني يمكن استخدام شيء مثل:

class MyDialog(QDialog):
    def __init__(self, parent=None):
         super(MyDialog, self).__init__(parent)

         self.table = QTableWidget()
         acell = MyCell()
         self.table.setItemPrototype(acell)

         self.table.setRowCount(5)
         self.table.setColumnCount(5)
         ....

ولكن هذا تحطم أكثر أو أقل بشكل عشوائي. عند استخدام طريقة self.table.setItem يعمل بدون مشكلة. هي موضع تقدير أي تلميحات.

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

المحلول

وهناك نوعان من القضايا هنا. يمكن للمرء أن يكون هناك مشكلة مع التعليمات البرمجية الخاصة بك، قد يكون البعض خطأ في باي كيوت.

في البيانات الخاصة بك () تطبيق الأسلوب، وربما كنت من المفترض أن أكتب هذا:

def data(self, role):
    t = QTableWidgetItem.data(self, role)
    ...

وهذا يستدعي البيانات الفائقة في الأسلوب () بدلا من إنشاء عنصر جديد والدعوة طريقة البيانات الخاصة به.

وعندما تقوم بإعداد الحوار الخاص بك، فإنك قد تحتاج للحفاظ على الإشارة إلى البند النموذج الخاص بك:

def __init__(self, parent=None):
    super(MyDialog, self).__init__(parent)

    self.table = QTableWidget()
    self.acell = MyCell()
    self.table.setItemPrototype(self.acell)

وعلى الرغم من أن وثائق كيو تي تقول أن ملكية النموذج يتم تمرير على أداة الجدول، لا تظهر الارتباطات باي كيوت للقيام بذلك، لذلك سوف تحتاج لمنع النموذج من أن القمامة التي تم جمعها.

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