2012-03-09 11 views
5

के साथ माउस को ट्रैक नहीं कर रहा है मुझे QMainWindow में माउस आंदोलनों को ट्रैक करने में कोई समस्या है। मेरे पास टॉगल बटन buttonGenerate है। यहाँ MainWindowQMainWindow setMouseTracking()

class MainWindow : public QMainWindow, private Ui::MainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 

protected: 
    void mouseMoveEvent(QMouseEvent *); 

private slots: 
    void on_buttonGenerate_toggled(bool checked); 
}; 

void MainWindow::mouseMoveEvent(QMouseEvent *event) 
{ 
    label_5->setText(tr("%1 %2 %3") 
        .arg(event->x()) 
        .arg(event->y()) 
        .arg(hasMouseTracking())); 

    event->ignore(); 
} 

void MainWindow::on_buttonGenerate_toggled(bool checked) 
{ 
    buttonGenerate->setText(checked 
          ? tr("Stop") 
          : tr("Start")); 
    setMouseTracking(checked); 
} 

के लिए कोड जब बटन चालू किए जाने पर है, माउस नज़र रखी जानी चाहिए और उसके एक्स & वाई के साथ ट्रैकिंग सक्षम है या label_5 में नहीं प्रदर्शित की जाएं या साथ समन्वय करता है। जब बटन को बंद कर दिया जाता है, तो माउस ट्रैकिंग बंद होनी चाहिए और लेबल_5 अपडेट नहीं किया जाना चाहिए। यह मामला नहीं है।

बटन दबाए जाने के बावजूद, माउस को ट्रैक नहीं किया जा रहा है। केवल जब मैं माउस बटन दबाएगा label_5 अपडेट किया जाएगा, और यह setMouseTracking(bool) सक्रिय है या नहीं, यह अनियंत्रित है।

किसी भी अंतर्दृष्टि की सराहना की जाएगी।

+0

क्या आपने सत्यापित किया है कि 'on_buttonGenerate_toggled' में' चेक' 'सत्य है जब आप इसकी अपेक्षा करते हैं? –

+0

हां, '% 3' तर्क 1 है जब toggled। – nerozehl

+0

लेकिन आप केवल यह देखते हैं कि जब आप माउस बटन दबा रहे हैं - यह मुझे एक संभावना के रूप में मारता है कि माउस प्रेस अस्थायी रूप से 'हैसउसट्रैकिंग' को 1 पर सेट करता है। इसलिए मैं इसे 'on_buttonGenerate_toggled' में सत्यापित करूँगा। –

उत्तर

12

यह इसलिए होता है क्योंकि क्यूटी डिजाइनर, QMainWindow में एक "छिपा" विजेट बनाता है के रूप में देखा जा सकता है उत्पन्न ui_MainWindow.h:

[...] 
centralWidget = new QWidget(MainWindow); 
[...] 
MainWindow->setCentralWidget(centralWidget); 

इस प्रकार यह इस विजेट जो माउस की घटनाओं को प्राप्त करता है और जो बच्चे विगेट्स पर QMainWindow नहीं, रखा जाता है।

अगर आप जगह:

centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents); 
setMouseTracking(true); 
अपने MainWindow के निर्माता में

, तो आप माउस ईवेंट दिखाई देंगे, लेकिन आप बटन दबाएँ नहीं कर सकते क्योंकि यह केंद्रीय विजेट किसी भी माउस घटना प्राप्त नहीं होता।

समाधान:

डिजाइन डिजाइनर (बटन & लेबल के साथ) में एक विजेट, अपने mouseMoveEvent ओवरराइड और इसके साथ एक QMainWindow::setCentralWidget है।

+0

लेकिन प्रलेखन का कहना है कि माउस चाल घटनाओं को प्रचारित किया जाना चाहिए? – nerozehl

+1

इसे तब तक प्रचारित किया जाता है जब तक यह स्वीकार नहीं किया जाता है, जो कि विजेट का मामला है जब तक कि आप इसे "ईवेंट पारदर्शी" नहीं बनाते। – Koying

+1

तो अपने QMainWindow में उप विजेट के शीर्ष पर ट्रैक करने में सक्षम होने के लिए, आपको प्रत्येक विजेट के लिए 'setMouseTracking (true)' को कॉल करने की आवश्यकता है! – phyatt

1

यह वास्तव में एक पुराना विषय है, मुझे खेद है, लेकिन मुझे अभी एक और समाधान मिला है। जब आप सभी मेनविंडो पर ईवेंट पकड़ना चाहते हैं, तो आप यह जांच कर QApplication::notify(QObject* obj, QEvent* ev) का उपयोग कर सकते हैं कि क्या ओबीजे आपकी खिड़की और आवश्यक घटना है, इसे प्रत्येक विजेट पर प्रत्येक ईवेंट के लिए बुलाया जाता है। आपको केवल क्यूप्लिकेशंस से उत्तराधिकारी होना चाहिए और अपना काम ओवरराइड अधिसूचना विधि में डालना होगा। मुझे लगता है कि यह किसी भी मुद्दे के लिए उपयोगी हो सकता है।

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