मेरे पास एक QTreeWidget है जिसमें उनमें मूल्य हैं, जिन्हें मैं केवल एक निश्चित संख्या में दशमलव दिखाना चाहता हूं लेकिन गणना उद्देश्यों के लिए सटीकता रखना चाहता हूं। मेरे पास यह सही ढंग से काम कर रहा है, लेकिन चयनित वस्तुओं की हाइलाइटिंग गड़बड़ कर दी गई है और उस सेल के चारों ओर सफेद दिखाया गया है जिसे खींचा गया है।

मैं हाइलाइटिंग को कैसे ठीक कर सकता हूं ताकि पूरी पंक्ति के लिए ठोस नीला हो?

class InitialDelegate(QtWidgets.QItemDelegate):
    'Changes number of decimal places in gas analysis self.chosen table'
    def __init__(self, decimals, parent=None):
        super().__init__(parent)
        self.nDecimals = decimals
    def paint(self, painter, option, index):
        if index.column() == 1:
            value = index.model().data(index, QtCore.Qt.DisplayRole)
            try:
                number = float(value)
                painter.drawText(option.rect, QtCore.Qt.AlignCenter , "{:.{}f}".format(number, self.nDecimals))
            except:
                QtWidgets.QItemDelegate.paint(self, painter, option, index)
        else:
            QtWidgets.QItemDelegate.paint(self, painter, option, index)

यह वही पैदा करता है:

enter image description here

1
Drees 12 जुलाई 2019, 01:35

1 उत्तर

सबसे बढ़िया उत्तर

इसके कार्यान्वयन में मेरे पास 2 अवलोकन हैं:

  • यदि आप केवल वही बदलना चाहते हैं जो टेक्स्ट के रूप में दिखाया गया है तो आपको paint() विधि क्योंकि यह न केवल टेक्स्ट को बल्कि बैकग्राउंड, आइकॉन आदि को भी पेंट करती है। drawDisplay() विधि को ओवरराइड किया जाना चाहिए।

  • यदि आप केवल कॉलम में परिवर्तन लागू करने जा रहे हैं तो प्रतिनिधि को setItemDelegateForColumn() विधि

उपरोक्त को ध्यान में रखते हुए, समाधान है:

from PyQt5 import QtCore, QtGui, QtWidgets


class InitialDelegate(QtWidgets.QItemDelegate):
    "Changes number of decimal places in gas analysis self.chosen table"

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

    def drawDisplay(self, painter, option, rect, text):
        option.displayAlignment = QtCore.Qt.AlignCenter
        try:
            number = float(text)
            text = "{:.{}f}".format(number, self.nDecimals)
        except:
            pass
        super().drawDisplay(painter, option, rect, text)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QTreeWidget(columnCount=3)
    delegate = InitialDelegate(2, w)
    w.setItemDelegateForColumn(1, delegate) # <---
    w.setHeaderLabels(["Gas Component", "Molecular Weight", "Mol%"])
    it = QtWidgets.QTreeWidgetItem(["Hexane", "86.1777", ""])
    w.addTopLevelItem(it)
    w.show()
    sys.exit(app.exec_())

प्लस:

अगर आप ऐसा ही करना चाहते हैं लेकिन QStyledItemDelegate का उपयोग कर रहे हैं तो समाधान ओवरराइड है initStyleOption():

class InitialDelegate(QtWidgets.QStyledItemDelegate):
    "Changes number of decimal places in gas analysis self.chosen table"

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

    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        option.displayAlignment = QtCore.Qt.AlignCenter
        try:
            text = index.model().data(index, QtCore.Qt.DisplayRole)
            number = float(text)
            option.text = "{:.{}f}".format(number, self.nDecimals)
        except:
            pass
2
eyllanesc 11 जुलाई 2019, 23:48