2013-01-15 11 views
7

मैं दो QListWidgets दोनों की अनुमति के कई चयन के साथ एक संवाद बनाने के लिए PyQT 4.8.3 का उपयोग कर रहा हूँ।मैं विजेट राज्यों में QListWidget आइटमों की लगातार हाइलाइटिंग कैसे प्राप्त करूं?

  1. मुझे लगता है कि अगर इन QListWidgets सक्षम हैं, चयनित आइटम, नीले रंग में हाइलाइट कर रहे हैं केवल जब QListWidget ध्यान केंद्रित किया उजागर बिना ध्यान केंद्रित प्रकाश ग्रे है।

  2. मैं भी लगता है कि अगर QListWidgets अक्षम हैं, चयनित आइटम फोकस की कमी के बावजूद नीले रंग में हाइलाइट किया जाता है।

enter image description here

उन दूसरे के सूची से जाना के रूप में वे इस बहुत भ्रामक मिल जाएगा।

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

मैंने कुछ भी लागू किए बिना QListWidget, QListView and QAbstractView के लिए दस्तावेज़ों को देखा है, मैंने बिना किसी किस्मत के stylesheet दस्तावेज़ों को भी देखा है।

उत्तर

9

मैं स्टाइलशीट का उपयोग यहां कर सकता हूं। इस उदाहरण में, इस QListWidget में चुने गए आइटम वह नीले रंग में हाइलाइट करेगा, और जब QListWidget अक्षम है या फोकस के बिना वे सलेटी हो जाएगा:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtCore, QtGui 

class myWindow(QtGui.QWidget): 

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

     self.setStyleSheet(""" QListWidget:item:selected:active { 
            background: blue; 
           } 
           QListWidget:item:selected:!active { 
            background: gray; 
           } 
           QListWidget:item:selected:disabled { 
            background: gray; 
           } 
           QListWidget:item:selected:!disabled { 
            background: blue; 
           } 
           """ 
           ) 

     self.listWidget = QtGui.QListWidget(self) 
     self.listWidget.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) 

     self.button = QtGui.QPushButton(self) 
     self.button.setText("Disable the list!") 
     self.button.clicked.connect(self.on_button_clicked) 

     self.layout = QtGui.QVBoxLayout(self) 
     self.layout.addWidget(self.button) 
     self.layout.addWidget(self.listWidget) 

     for itemNumber in range(5): 
      item = QtGui.QListWidgetItem(self.listWidget) 
      item.setText("Item {0}".format(itemNumber)) 
      self.listWidget.addItem(item) 


    @QtCore.pyqtSlot() 
    def on_button_clicked(self): 
     enable = False if self.listWidget.isEnabled() else True 

     self.listWidget.setEnabled(enable) 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('myWindow') 

    main = myWindow() 
    main.show() 

    sys.exit(app.exec_()) 
+1

स्टाइलशीट रास्ता है, लेकिन मुझे लगता है कि आप [उत्तर] [http://qt-project.org/doc/qt-4.8/stylesheet-examples.html#customizing-qlistview) के समान अपना उत्तर बढ़ा सकते हैं। ': सक्रिय',':! सक्रिय 'और' अक्षम 'छद्म-राज्य ':: item' के लिए चयनित' 'के साथ संयुक्त रूप से कोई अनुकूलन विकल्प प्रदान करेगा। मैं कोई जवाब नहीं जोड़ना चाहता था, क्योंकि आपके पास पहले से ही एक स्टाइलशीट का उल्लेख है :)। – Avaris

+0

@Avaris आपके सुझावों के लिए धन्यवाद! मैंने उन्हें अपने जवाब में जोड़ा :) –

+0

अच्छा! बस मैं जो खोज रहा था, मैं चाहता हूं कि स्टाइलशीट के लिए आधिकारिक दस्तावेज़ सहायक हों। मैं जोड़ूंगा कि पृष्ठभूमि पूरे राज्यों में सुसंगत थी, जबकि QListWidget के चयनित आइटम का टेक्स्ट रंग फोकस के बिना काले रंग से काले रंग में बदल गया था। "रंग: सफेद" जोड़कर आसानी से हल किया गया स्टाइलशीट के प्रत्येक खंड में। धन्यवाद! –

1

QItemDelegate कस्टम प्रदर्शन सुविधाओं प्रदान करने के लिए इस्तेमाल किया जा सकता। मुझे आशा है कि यह आपकी मदद करेगा। आप

virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
2

सरल दृष्टिकोण में परिवर्तन है QPalette (यदि शैली पत्रक नहीं है आप के लिए काम करता हूं)।
बस मूल्यों आप को बदलने के लिए (केवल) चाहते हैं के साथ QListView के लिए पैलेट निर्धारित किया है।

ऐसा ही कुछ कार्य करें:

QPalette customPalette; 
QPalette orginalPallete = listView->palette(); 
customPalette->setBrush(QPalette::Disabled, QPalette::Highlight, 
         orginalPallete.brush(QPalette::Active, QPalette::Highlight)); 
listView->setPalette(customPalette); 

मैं कैसे पढ़ने के लिए पैलेट संपत्ति काम करता है की सलाह देते हैं (यह माता-पिता से मूल्यों विलीन हो जाती है और QApplication आप केवल एक चीज आप बदलना चाहते हैं सेट की जरूरत है तो)।
आप QApplication के लिए पैलेट को बदलकर वैश्विक रूप से इस रंग को भी बदल सकते हैं।

संबंधित मुद्दे