سؤال

لدي كتابليدجيت مع مربعات الاختيار في بعض الخلايا.أريد تعطيل المستخدم لإجراء النقر بالماوس فوق خلايا الجدول (حتى لا يتمكن من تغيير حالة مربع الاختيار) لبعض الوقت أثناء استخدام البيانات من الجدول.لقد حاولت table.setDisabled(1) لكن هذا يعطل الجدول بأكمله وأحتاج إلى التمرير ليتم تمكينه.

أي مساعدة سيكون موضع تقدير.

تحرير لنكون أكثر دقة:يمكن أن يكون هناك ما يصل إلى 15 * 3000 خلية في الجدول ، مليئة بالنص(قابل للتحرير) ، مربع الاختيار(قابل للتحقق) ، رسم سفغ(يفتح نافذة أخرى عند النقر المزدوج عليه) أو بعض الحاجيات المخصصة(التي تحتوي أيضا على أجزاء قابلة للنقر أو قابلة للتحرير).أحتاج إلى تعطيل المستخدم للنقر أو النقر المزدوج فوق الخلايا(حتى لا يتمكن من تغيير أي منها) للفاصل الزمني 1 ثانية - 10 ثانية (يجب أن يكون الحل شيئا سريعا ، وليس التكرار من خلال جميع العناصر) ، لكنني بحاجة إلى شريط التمرير ليتم تمكينه ورؤية الجدول العادية.

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

المحلول

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

للتحكم في "قابلية التحقق" لجميع العناصر ، يمكنك إضافة سمة فئة إلى الفئة الفرعية التي يمكن اختبارها كلما تم تمرير قيمة لدور حالة التحقق إلى سيتداتا.

إليك ما قد تبدو عليه الفئة الفرعية:

class TableWidgetItem(QtGui.QTableWidgetItem):
    _blocked = True

    @classmethod
    def blocked(cls):
        return cls._checkable

    @classmethod
    def setBlocked(cls, checkable):
        cls._checkable = bool(checkable)

    def setData(self, role, value):
        if role != QtCore.Qt.CheckStateRole or self.checkable():
            QtGui.QTableWidgetItem.setData(self, role, value)

وسيتم تعطيل "التحقق" من جميع العناصر مثل هذا:

    TableWidgetItem.setCheckable(False)

تحديث:

يمكن تمديد الفكرة أعلاه عن طريق إضافة فئة غلاف عامة لأدوات الخلية.

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

سوف تحتاج إلى إنشاء الحاجيات الخلية مثل هذا:

    widget = CellWidget(self.table, QtGui.QLineEdit())
    self.table.setCellWidget(row, column, widget)

ومن ثم الوصول إليها مثل هذا:

    widget = self.table.cellWidget().widget()

سيتم تشغيل حظر الجدول بأكمله على هذا النحو:

    TableWidgetItem.setBlocked(True)
    CellWidget.setBlocked(True)
    # or Blockable.setBlocked(True)

هنا هي الطبقات:

class Blockable(object):
    _blocked = False

    @classmethod
    def blocked(cls):
        return cls._blocked

    @classmethod
    def setBlocked(cls, blocked):
        cls._blocked = bool(blocked)

class TableWidgetItem(Blockable, QtGui.QTableWidgetItem):
    def setData(self, role, value):
        if (not self.blocked() or (
            role != QtCore.Qt.EditRole and
            role != QtCore.Qt.CheckStateRole)):
            QtGui.QTableWidgetItem.setData(self, role, value)

class CellWidget(Blockable, QtGui.QWidget):
    def __init__(self, parent, widget):
        QtGui.QWidget.__init__(self, parent)
        self._widget = widget
        layout = QtGui.QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(widget)
        widget.setParent(self)
        widget.installEventFilter(self)
        if hasattr(widget, 'viewport'):
            widget.viewport().installEventFilter(self)
        widget.show()

    def widget(self):
        return self._widget

    def eventFilter(self, widget, event):
        if self.blocked():
            etype = event.type()
            if (etype == QtCore.QEvent.KeyPress or
                etype == QtCore.QEvent.KeyRelease or
                etype == QtCore.QEvent.MouseButtonPress or
                etype == QtCore.QEvent.MouseButtonRelease or
                etype == QtCore.QEvent.MouseButtonDblClick or
                etype == QtCore.QEvent.ContextMenu or
                etype == QtCore.QEvent.Wheel):
                return True
        return QtGui.QWidget.eventFilter(self, widget, event)

نصائح أخرى

مجرد تكرار من خلال جميع QStandardItemق والتغيير قيم الأعلام للعناصر التي لا ينبغي أن تكون قابلة للتغيير.
يمكنك استخدام العلم: Qt::ItemIsEditable أو / و Qt::ItemIsEnabled.

سوف تحتاج إلى تعطيل العناصر نفسها بدلا من الجدول بأكمله إذا كان لديك عناصر أخرى من كشيكبوكسيس التي لا ترغب في تعطيل.انظر رمز بايثون أدناه للحصول على التفاصيل:

'''
    Iterate through all the check boxes in the standard items
    and make sure the enabled flag is cleared so that the items are disabled
'''
for standardItem in standardItems:
    standardItem.setFlags(standardItem.flags() & ~Qt.ItemIsEnabled)

هنا يمكنك العثور على الوثائق المقابلة:

فواد كتبليويدجيتيتم::سيتفلاغس(كيو تي:: إيتمفلاغس أعلام)

تعيين الأعلام لهذا البند إلى أعلام معينة.تحدد هذه ما إذا كان يمكن تحديد العنصر أو تعديله.

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