2016-06-29 6 views
5

मैं PySide साथ एक कंप्यूटर अनुप्रयोग के विकास कर रहा हूँ और मैं QTableWidget उपयोग कर रहा हूँ। आइए मान लें कि मेरी तालिका में 3 कॉलम हैं, लेकिन उनके पास मौजूद डेटा बहुत अलग है, जैसे कि (प्रत्येक पंक्ति के लिए) पहले कॉलम में एक लंबी वाक्य, फिर दो अंतिम कॉलम में 3 अंकों की संख्या। मैं चाहते हैं मेरी मेज आदेश डेटा करने के लिए अपने आकार को समायोजित करने, या कम से कम सक्षम के रूप में (जैसे) स्तंभ आकार उपलब्ध स्थान की 70/15/15% सेट करने के लिए होने के लिए आकार बदलने के लिए।PySide - PyQt: कैसे QTableWidget स्तंभ चौड़ाई उपलब्ध स्थान का अनुपात के रूप में स्थापित कर लिए?

यह करने के लिए सबसे अच्छा तरीका क्या है?

मैंने this question पढ़ने के बाद table.horizontalHeader().setResizeMode(QHeaderView.Stretch) को आजमाया है, लेकिन यह उसी आकार के 3 कॉलम बनाता है।

मैंने table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)Fabio के comment के लिए भी धन्यवाद है, लेकिन यह आवश्यकतानुसार सभी उपलब्ध स्थान को भरता नहीं है।

न तो Interactive, Fixed, Stretch, ResizeToContentsQHeaderView documentation से मुझे देने के लिए मैं क्या जरूरत है (देखें दूसरे संपादित करें) लगते हैं।

किसी भी मदद की सराहना की जाएगी, भले ही यह क्यूटी/सी ++ के लिए हो! आपका बहुत बहुत धन्यवाद।


संपादित करें: मैं एक समाधान की तरह पाया लेकिन यह अभी भी मैं के लिए क्या देख रहा हूँ नहीं है:

header = table.horizontalHeader() 
header.setResizeMode(QHeaderView.ResizeToContents) 
header.setStretchLastSection(True) 

यह बेहतर होगा अगर वहाँ अस्तित्व में एक setStretchFirstSection विधि, लेकिन दुर्भाग्य से वहाँ करता है एक प्रतीत नहीं होता है।


संपादित करें 2:

केवल बात यह है कि तालिका में संशोधित किया जा सकता है अंतिम स्तंभ, उपयोगकर्ता उस में एक नंबर दर्ज कर सकते हैं। लाल तीर इंगित करता है कि मैं क्या चाहता हूं।

यहाँ StretchStretch

साथ होता है यहाँ ResizeToContentsResizeToContents

+0

QHeaderView.ResizeToContents को QHeaderView.Stretch – Fabio

+0

के बजाय कोशिश करें यह काम करता है, लेकिन यह काफी नहीं है कि मैं 'ResizeToContents' के साथ, क्योंकि मेरे कॉलम पर्याप्त नहीं हैं, वे उपलब्ध स्थान को भर नहीं पाते हैं। मैं संपादित करूंगा ताकि यह और स्पष्ट हो जाए। – BusyAnt

उत्तर

10

इसे प्रत्येक कॉलम के लिए आकार बदलने के तरीके को हल करके हल किया जा सकता है। प्रथम खंड, उपलब्ध स्थान को लेने के लिए खिंचाव चाहिए, जबकि पिछले दो वर्गों सिर्फ उनकी सामग्री आकार परिवर्तन करें:

PyQt4:

header = self.table.horizontalHeader() 
header.setResizeMode(0, QtGui.QHeaderView.Stretch) 
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents) 

PyQt5:

header = self.table.horizontalHeader()  
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) 
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) 
+0

प्राप्त परिणामों के साथ संपादित करूंगा, मुझे नहीं पता था कि मैं प्रत्येक कॉलम के लिए एक अलग 'QHeaderView' चुन सकता हूं। यह ठीक काम करता है, हालांकि मैंने पिछले दो कॉलम के लिए 'फिक्स्ड' में बदल दिया है और फिर 'self.table.setColumnWidth (इंडेक्स, चौड़ाई)' के साथ न्यूनतम चौड़ाई जोड़ दी है (सूट मेरे मामले में बेहतर है) – BusyAnt

+2

qt5 में यह फ़ंक्शन setSectionResizeMode में बदल दिया गया है() –

2

के साथ होता है आप QItemDelegates या QStyledItemDelegates साथ ऐसा कर सकते है। आप सामग्री और को आकार बदलने के लिए स्वत: खिंचाव करना चाहते हैं, तो आप का चयन करने के जो स्तंभ "खिंचाव" कॉलम है की आवश्यकता होगी।

class ResizeDelegate(QStyledItemDelegate): 

    def __init__(self, table, stretch_column, *args, **kwargs): 
     super(ResizeDelegate, self).__init__(*args, **kwargs)   
     self.table = table 
     self.stretch_column = stretch_column 

    def sizeHint(self, option, index): 
     size = super(ResizeDelegate, self).sizeHint(option, index) 
     if index.column() == self.stretch_column: 
      total_width = self.table.viewport().size().width() 
      calc_width = size.width() 
      for i in range(self.table.columnCount()): 
       if i != index.column(): 
        option_ = QtGui.QStyleOptionViewItem() 
        index_ = self.table.model().index(index.row(), i) 
        self.initStyleOption(option_, index_) 
        size_ = self.sizeHint(option_, index_) 
        calc_width += size_.width() 
      if calc_width < total_width: 
       size.setWidth(size.width() + total_width - calc_width) 
     return size 

... 

table = QTableWidget() 
delegate = ResizeDelegate(table, 0) 
table.setItemDelegate(delegate) 
... # Add items to table 
table.resizeColumnsToContents() 

आप ResizeToContents को आकार बदलने मोड सेट कर सकते हैं, या यदि आप चाहते हैं, जरूरत के रूप में स्तंभ चौड़ाई समायोजित सिर्फ तालिका आइटम के लिए परिवर्तन करने के बाद मैन्युअल resizeColumnsToContents कॉल करने के लिए सक्षम होने के लिए उपयोगकर्ता।

आपको कॉलम के बीच मार्जिन और पैडिंग के कारण चौड़ाई की गणना के साथ थोड़ी सी भीड़ की आवश्यकता हो सकती है (जैसे प्रत्येक कॉलम के लिए सेल सीमा के लिए calculated_width में पिक्सेल या दो जोड़ें)।

+0

यह अच्छा है क्योंकि अब मेरे कॉलम किसी भी समय आकार का आकार बदलते नहीं हैं, लेकिन वे अभी भी सभी उपलब्ध स्थान नहीं लेते हैं, और "खिंचाव" कॉलम को बदलने से कोई प्रभाव नहीं पड़ता है ... क्या मैं कुछ गलत कर रहा है? मैं अपने प्रश्न को – BusyAnt

2

PyQt4

header = self.table.horizontalHeader() 
header.setResizeMode(0, QtGui.QHeaderView.Stretch) 
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents) 
header.setResizeMode(3, QtGui.QHeaderView.Stretch) 

पीईक्यूटी 5

header = self.table.horizontalHeader()  
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) 
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) 
header.setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch) 
संबंधित मुद्दे