PyQt

2012-03-20 25 views
16
Windows में NoFocus की स्थापना

अतः इस बारे में पर कुछ सवाल, जो सभी के कहना है कि बिंदीदार सीमा को दूर करने के लिए एक ही रास्ता to set the focusPolicy on widget/item in question to NoFocus है लग रहे हैं बिना बिंदीदार सीमा निकाला जा रहा है। हालांकि यह एक अस्थायी फिक्स के रूप में काम करता है, यह अन्य आवश्यक फोकस इवेंट्स के दायरे में कहा विजेट/आइटम के साथ आगे की बातचीत को रोकता है। सवाल मेंPyQt

ने कहा सीमा:

Dotted Focus? Border

यहाँ क्यों यह काम नहीं करता, इसका एक उदाहरण।

  • मेरे पास एक गैर-मॉडल विजेट पॉपअप है, एक छवि के लिए एक लाइटबॉक्स सोचें।
  • मैं विजेट के बाहर माउसPressEvent का पता लगाना चाहता हूं और परिणामस्वरूप विजेट को बंद करना चाहता हूं। ऐसा करने के लिए, मुझे catch the focusOutEvent चाहिए।
  • हालांकि, अगर मेरे प्रोग्राम में विजेट का विशाल बहुमत नोफोकस (सीमा मुद्दे को हटाने के लिए) के रूप में सेट किया गया है, तो मैं फोकसऑटवेन्ट नहीं पकड़ सकता क्योंकि आपने अनुमान लगाया है कि उनके पास कोई फोकस नीति नहीं है।

    • मैं एक QTreeWidget कि subclassed है तो मैं विभिन्न कारणों के लिए keyPressEvents पकड़ कर सकते हैं है:

    यहाँ एक और उदाहरण है।

  • QTreeWidget सीमा को रोकने के लिए नोफोकस के रूप में भी सेट किया गया है। इस वजह से, विजेट कभी फोकस नहीं करता है और इसलिए कोई भी keyPressEvents पकड़ा जा सकता है।
  • इस के लिए एक कामकाज (kludgy, imo) use the widget's grabKeyboard class है, जो खतरनाक है अगर मैं बाद में केबोर्ड को रिलीज़ करना भूल जाता हूं। यह इष्टतम नहीं है।

तो सवाल यह है कि, मेरे ऐप में सब कुछ के लिए फोकस बंद किए बिना इस अजीब (ज्यादातर बदसूरत) बिंदीदार सीमा को हटाने का कोई तरीका है? अग्रिम में धन्यवाद!

+0

किस ऑपरेटिंग आप पर प्रणाली का उपयोग कर? – jdi

+0

विंडोज़ (7), मुझे डर है। – Cryptite

+0

ठीक है तो आप एक कस्टम पेंटवेन्ट में जा रहे हैं: -/ – jdi

उत्तर

37

वांछित वस्तु के outline: 0 सेट करें। निम्नलिखित उदाहरण देखें जो इसे QTableView के लिए सेट करता है।

QTableView 
{ 
    outline: 0; 
} 

QAbstractItemView विरासत कक्षाओं के लिए काम करता है। (QTreeWidget, QTableWidget आदि)। आश्चर्यजनक रूप से क्यूटी दस्तावेज़ीकरण में इस सीएसएस संपत्ति का उल्लेख नहीं किया गया है।देखें QT Style Sheet Reference Documenation.

+5

पवित्र भगवान जो कुछ भी लिया गया है। अपने QTreeView शैली पर चिपकाएं और आप सुनहरे हो। – Cryptite

+1

यह QAbstractButton विरासत वर्गों के लिए भी काम करता है, उदा। क्यूपश बटन, क्यूराडियो बटन और क्यूकेकबॉक्स। इसे अभी मेरे सी ++ क्यूटी एप्लिकेशन में इस्तेमाल किया गया है। महान! – Sumyrda

+0

आपने सर को अपना दिन बचाया, यह मेरे क्यूपशबटन को अगले स्तर पर ले गया क्योंकि मेरे बटन संकीर्ण हैं और डॉट्स टेक्स्ट को कवर कर रहे थे। उन लोगों के लिए छोटे और स्पष्ट नोट जो लाइनों के बीच नहीं पढ़ते हैं, "रूपरेखा: 0;" सीधे आपके qstylesheet गुणों में जोड़ा जाता है। धन्यवाद! – JavaBeast

3

ओएसएक्स पर आप QWidget.setAttribute(QtCore.Qt.WA_MacShowFocusRect, False) कर सकते हैं। विन या लिनक्स के बारे में निश्चित नहीं है। आप शैली के माध्यम से यह करने के लिए हो सकता है।

+0

बस मज़ेदार मस्ती के लिए, मैंने इसे सेट करने का प्रयास किया, लेकिन जैसा कि आप कल्पना कर सकते हैं कि विंडोज़ में मेरे लिए कुछ भी नहीं है। मैं आगे बढ़ गया हूं और इस पर अधिक ध्यान आकर्षित करने के प्रयास में एक बक्षीस रखा है। किसी भी मामले में मदद जेडीआई के लिए धन्यवाद। जिस ऐप को मैं लिख रहा हूं उसके पास जल्द ही मैक पोर्ट होगा, इसलिए यह अभी भी उपयोगी होगा। – Cryptite

1

अधिकांश शैलियों QStyle::drawPrimitive फ़ंक्शन को PE_FrameFocusRect पर फोकस सूचक के चित्र को चित्रित करने के तत्व के रूप में दर्शाती हैं।

तो आपको लगता है कि विश्व स्तर पर निष्क्रिय करने के लिए निम्नलिखित शैली वर्ग आवेदन उदाहरण पर स्थापित के साथ सक्षम होना चाहिए:

class NoFocusProxyStyle : public QProxyStyle { 
public: 

    NoFocusProxyStyle(QStyle *baseStyle = 0) : QProxyStyle(baseStyle) {} 

    void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { 
     if(element == QStyle::PE_FrameFocusRect) { 
      return; 
     } 
     QProxyStyle::drawPrimitive(element, option, painter, widget); 
    } 

}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv);  
    a.setStyle(new NoFocusProxyStyle); 
    ... 

पुनश्च: यह कुछ विगेट्स (बटन, बता गया) के लिए QGtkStyle साथ है, तो काम नहीं करता है यह विंडोज या मैक के लिए भी काम नहीं कर सकता है।

+0

मुझे यह देखना होगा कि क्या मैं इसे पीईक्यूटी के लिए पायथन में परिवर्तित नहीं कर सकता, लेकिन मैं इसे एक शॉट दूंगा। – Cryptite

+0

@ क्रिप्टिट: यह पीईक्यूटी (या पायसाइड) के साथ काम नहीं करता है क्योंकि कक्षा 'QProxyStyle' को पायथन में निर्यात नहीं किया जाता है। और चूंकि विशिष्ट शैलियों ('QWindowsStyle', 'QWindowsXPStyle' ...) को निर्यात नहीं किया जाता है, इसलिए आप उस शैली को वर्तमान शैली में ओवरराइड नहीं कर सकते हैं (मैंने बंदर पैचिंग को भी कोशिश की है,' QApplication.style पर drawPrimitive को प्रतिस्थापित करने के लिए() ', लेकिन मुझे सच में यकीन नहीं है कि मैंने इसे सही तरीके से किया है)। – alexisdm

+0

तो साजिश मोटा हो जाता है। इसे हासिल करने के लिए कुछ रास्ता होना चाहिए। हस्तक्षेप के अंधेरे में किसी ने इस समस्या को हल किया होगा। – Cryptite

0

आप PyQt5 के साथ ऐसा कर सकते हैं:

class Style(QProxyStyle): 
    def drawPrimitive(self, element, option, painter, widget): 
     if element == QStyle.PE_FrameFocusRect: 
      return 
     super().drawPrimitive(element, option, painter, widget) 

app.setStyle(Style()) 
+0

यह एक अच्छा समाधान नहीं है क्योंकि यह QTableWidget को महत्वपूर्ण रूप से अंतराल का कारण बनता है। – Kermit