2012-10-09 17 views
11

में आइकन प्रदर्शित नहीं कर रहा है मुझे वर्तमान आइकन थीम से चयनित QAction के आइकन को प्रदर्शित करने में समस्याएं आ रही हैं। मैंने क्यूटी डिजाइनर के साथ ui बनाया और इसे pyuic4 sample.ui > sample.py के साथ निर्यात किया।QIcon.fromTheme PyQt

from PyQt4 import QtCore, QtGui 
import sys 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    _fromUtf8 = lambda s: s 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(800, 600) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 
     self.toolBar = QtGui.QToolBar(MainWindow) 
     self.toolBar.setObjectName(_fromUtf8("toolBar")) 
     MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) 
     self.actionSample = QtGui.QAction(MainWindow) 
     self.actionSample.setObjectName(_fromUtf8("actionSample")) 
     self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open"))) 
     self.toolBar.addAction(self.actionSample) 

     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(window) 
    window.show() 
    app.exec_() 

जब मैंने इसे निष्पादित, टूलबार आइकन प्रदर्शित नहीं करता है 'दस्तावेज़ खुले': self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open"))) साथ विषय से आइकन स्थापित करने के बाद, मैं निम्नलिखित स्रोत कोड मिलता है। क्या यह एक बग है या क्या मैं कुछ गलत कर रहा हूं?

धन्यवाद

+0

आप किस प्लेटफॉर्म पर हैं, और आप किस क्यूटी का उपयोग कर रहे हैं? साथ ही, क्या आपने डिज़ाइनर में आइकन सेट किया है, या इसे मैन्युअल रूप से जोड़ दिया है? – ekhumoro

+0

@ekhumoro मैं चला रहा हूँ: जीएनयू/लिनक्स 3.2.0-2-686 - डेबियन परीक्षण/ अजगर 2.7.3rc2/ अजगर-QT4 4.9.3-4/ मैं पैदा करने के बाद आइकन मैन्युअल की स्थापना की ' .py' फ़ाइल। लेकिन जब मैं इसे क्यूटी-डिजाइनर के साथ उत्पन्न करता हूं तो यह वही होता है। – Hypergraphe

+0

एक्शन एडिटर में नया एक्शन डायलॉग "आइकन थीम" संपत्ति के बगल में आइकन दिखाएगा यदि यह उपलब्ध है। – ekhumoro

उत्तर

11

आइकन देखने प्रक्रिया QIcon.fromTheme द्वारा इस्तेमाल किया कुछ जटिल है।

आइकन थीम केवल गनोम और केडीई डेस्कटॉप वातावरण के लिए एक्स 11 प्लेटफ़ॉर्म पर समर्थित हैं। अन्य प्लेटफ़ॉर्म/डेस्कटॉप के लिए, एप्लिकेशन के साथ थीम इंस्टॉल करना आवश्यक होगा, या उपयोगकर्ता के पर्यावरण को विभिन्न तरीकों से ट्विक करना आवश्यक होगा।

गनोम के लिए वर्तमान सिस्टम थीम ढूंढने के लिए, क्यूटी gconf (यदि gtk शैली उपलब्ध है) क्वेरी करेगा, और अन्यथा "gnome" विषय के लिए डिफ़ॉल्ट होगा। केडीई के लिए, क्यूटी kdeglobals सेटिंग्स फ़ाइल (ओं) की जांच करेगा, और अन्यथा "ऑक्सीजन" (या "केडीई के पुराने संस्करणों के लिए" क्रिस्टलवग ") के लिए डिफ़ॉल्ट होगा। इसके अलावा, "हिकोलर" विषय हमेशा फॉलबैक के रूप में उपयोग किया जा सकता है।

सिस्टम थीम नाम निर्धारित होने के बाद, क्यूटी विभिन्न पूर्व-निर्धारित स्थानों में आइकन वाली निर्देशिका की तलाश करेगा, जो फिर से प्लेटफॉर्म और डेस्कटॉप दोनों पर निर्भर करता है। एक्स 11 पर, इसमें $HOME/.icons और $XDG_DATA_DIRS/icons शामिल हैं। सभी प्लेटफार्मों/डेस्कटॉपों के लिए आम एकमात्र स्थान संसाधन पथ :/icons है।

आइकन थीम निर्देशिकाओं में index.theme फ़ाइल शामिल होनी चाहिए, जो (अन्य चीजों के साथ) उपनिर्देशिका निर्दिष्ट करती है जिसमें आइकन हो सकते हैं। png या svg एक्सटेंशन वाले आइकन आइकन का उपयोग किया जाता है।

QIcon वर्ग कुछ स्थिर तरीकों जो वास्तव में दिखाई देगा जहां क्यूटी थीम पर आधारित प्रतीक की तलाश में है है:

>>> from PyQt4 import QtGui 
>>> app = QtGui.QApplication([]) 
>>> for path in QtGui.QIcon.themeSearchPaths(): 
...  print "%s/%s" % (path, QtGui.QIcon.themeName()) 
... 
/home/ekhumoro/.icons/hicolor 
/usr/local/share/icons/hicolor 
/usr/share/icons/hicolor 
:/icons/hicolor 

"दस्तावेज़ खुले" आइकन नहीं दिखाया जाता है, तो या तो क्यूटी में लग रही है "गलत" जगह, या आइकन पूरी तरह से गायब है।

अद्यतन:

जैसा कि मैंने ऊपर कहा: डिफ़ॉल्ट रूप से, क्यूटी केवल GNOME और KDE X11 मंच पर समर्थन करता है। यह FluxBox WM के बारे में कुछ भी नहीं जानता है, और इसलिए वर्तमान आइकन थीम का पता नहीं लगा सकता है। इसका मतलब है कि यह एक न्यूनतम "हिकोलर" थीम का उपयोग करने के लिए वापस आ जाएगा, जिसमें सभी आवश्यक आइकन नहीं हो सकते हैं।

इस समस्या को हल करने का एक तरीका है, "हिकोलर" सिम्लिंक बनाना जो उस थीम को इंगित करता है जिसका आप उपयोग करना चाहते हैं।

$ ln -s icon/theme/directory $HOME/.icons/hicolor 

अद्यतन 2: आदर्श रूप में, यह स्थान खोज रास्तों में से क्यूटी की सूची में पहले है कि में जाना चाहिए

Qt5 अभी भी केवल डिफ़ॉल्ट रूप से केडीई और सूक्ति का समर्थन करता है, लेकिन कम से कम Qt Platform Abstraction layer बनाता है पर कस्टम थीम प्लगइन्स बनाना संभव है (LXQT एक डेस्कटॉप वातावरण है जो इसका लाभ उठाता है)।कई और डीई भी हैं जिन्हें अब gtk/gnome: X-CINNAMON, UNITY, MATE, XFCE और LXDE के रूप में माना जाता है।

+1

मैं फ्लक्सबॉक्स डब्ल्यूएम चला रहा हूं। जब मैं ऊपर कोड की टुकड़ा निष्पादित, मैं मिलता है: '/home/ben/.icons/hicolor /usr/स्थानीय/शेयर/माउस/HiColor /usr/share/माउस/HiColor :/माउस/hicolor' प्रतीक इंडेक्स के साथ '/ usr/share/icons/hicolor' में स्थित हैं, तो यह सही काम करना चाहिए? – Hypergraphe

+1

ठीक है, मैंने थीम को 'setThemeName' स्थिर विधि के साथ अपने '.icons' में से एक में बदल दिया है और यह अच्छी तरह से काम करता है। कोई विचार क्यों PyQt अन्य खोज पथों में नहीं देखता है? – Hypergraphe

+1

यह एक अच्छा विचार है। मै वो कर लूंगा। आपका बहुत बहुत धन्यवाद। – Hypergraphe