2008-11-26 6 views
18

क्यूटी में, जब कोई विजेट फोकस प्राप्त करता है, तो इसके बारे में अधिसूचना कैसे प्राप्त हो सकती है, इसलिए मैं कुछ कस्टम कोड निष्पादित कर सकता हूं? क्या इसके लिए कोई संकेत या घटना है?एक क्यूटी विजेट फोकस होने पर अधिसूचना/घटना/संकेत प्राप्त करें

+0

विषय से बाहर का उपयोग कर सकते हैं; मैं उत्सुक हूं कि आपने सी ++ बिल्डर क्यों छोड़ा? – geo

+2

मैंने प्रासंगिक घटनाओं को सूचित करने के लिए QWidget में उत्सर्जित संकेतों का सुझाव देने के लिए एक [जिरा टिकट] (http://bugreports.qt.nokia.com/browse/QTBUG-16732) बनाया है। (फोकसइन और फोकसऑट * * प्रासंगिक घटनाएं हैं)। कृपया अगर आप इस बारे में परवाह करते हैं और सुझाव देते हैं तो कृपया। धन्यवाद। –

उत्तर

6

क्यूटी 4.1 में पेश किए जाने पर ध्यान केंद्रित करते समय एक "फोकस चेंज" सिग्नल भेजा जाता है।

void QApplication::focusChanged(QWidget * old, QWidget * now) 
+0

संदर्भ के लिए, यहां Qt दस्तावेज़ों में फ़ंक्शन है: http://doc.qt.io/qt-5/qapplication.html#focusChanged – Hawkins

2

मैं इसके साथ खेलने के लिए होगा, लेकिन सिर्फ क्यूटी प्रलेखन को देखते हुए, वहाँ एक "focusInEvent":
यह वह ध्यान और एक प्राप्त फोकस खोने विजेट दो तर्क हैं, तो। यह एक घटना हैंडलर है।

यहां बताया गया है कि आप किस बारे में जानकारी प्राप्त करते हैं .... "क्यूटी सहायक" खोलें। इंडेक्स पर जाएं। एक "QLineEdit" में रखो। सभी विजेट पृष्ठों पर "विरासत सदस्यों समेत सभी सदस्यों की सूची" नामक एक बहुत ही उपयोगी लिंक है। यह सूची बहुत अच्छी है, क्योंकि इसमें विरासत में भी सामान है।

मैंने "फोकस" की त्वरित खोज की और इस विजेट के लिए फ़ोकस से संबंधित सभी चीज़ें पाईं।

0

QWidget :: setFocus() स्लॉट है, संकेत नहीं है। आप जांच सकते हैं कि QLineEdit focus property के साथ फ़ोकस में है या नहीं। जब टेक्स्ट बदल जाता है या संपादित किया जाता है, तो QLineEdit संकेतों को उत्सर्जित करता है, दस्तावेज़ देखें।

10

क्यूटी डिजाइनर WYSIWYG प्रोग्रामिंग के इस स्तर के लिए डिज़ाइन नहीं किया गया है।

C++ करें:

class LineEdit : public QLineEdit 
{ 
    virtual void focusInEvent(QFocusEvent*) 
    {} 
}; 
2

आप क्यूटी में अजीब विभाजन के पर पहुंच गया है अगर आप प्रलेखन focusInEvent पर देखने के एक स्लॉट यह है एक संरक्षित समारोह, आप इसे अगर आप ओवरराइड कर सकते हैं नहीं है आपके विजेट के उप-वर्ग को कार्यान्वित कर रहे हैं। यदि आप बस अपने विजेट में आने वाली घटना को पकड़ना चाहते हैं तो आप QObject::installEventFilter का उपयोग कर सकते हैं, यह किसी भी तरह की घटनाओं को पकड़ने देता है।

कुछ अजीब कारण Trolltech के डेवलपर्स दो रास्ते, संकेत/स्लॉट और QEvent

+1

आप वर्चुअल बेस फ़ंक्शन को ओवरराइड कर सकते हैं। यही कारण है कि घटनाएं आभासी कार्य हैं।Trolltech इसके बजाय सिग्नल का उपयोग करते हैं जब उस कार्यक्षमता के लिए विरासत उपयोगी होने की संभावना नहीं है। – mxcl

+0

घटनाक्रम और सिग्नल/स्लॉट काफी अलग हैं। उदाहरण के लिए, ऑर्डर प्राप्त करने वाले ऑर्डर को स्पष्ट रूप से परिभाषित किया जाता है, और ईवेंट को संभालने के बाद प्रसंस्करण रोक दिया जाता है। –

5

सबसे आसान तरीका है के माध्यम से यूआई घटनाओं का प्रचार करने का निर्णय लिया के लिए QApplication करने के लिए एक स्लॉट कनेक्ट करने के लिए है :: संकेत focusChanged।

31

आप एन event filter जोड़ सकते हैं।
यह QtCreator के साथ लिखे गए एप्लिकेशन का एक उदाहरण है। इस फॉर्म में QComboBox नाम combobox है।


MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent),ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ui->comboBox->installEventFilter(this); 
    . 
    . 
    . 
} 

bool MainWindow::eventFilter(QObject *object, QEvent *event) 
{ 
    if (event->type() == QEvent::FocusOut) 
    { 
     if (object == ui->comboBox) 
     { 
      qWarning(object->objectName().toLatin1().data()); 
     } 
    } 
    return false; 
} 
+2

+1 बिल्कुल वही जो मैं खोज रहा था, धन्यवाद! – lostriebo

0

शायद ज़रुरत किसी में दो QMainWindow फोकस परिवर्तन की तलाश में। आप

if(e->type() == QEvent::WindowActivate) 
{ 
    //qDebug() << "Focus IN " << obj << e ; 

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