Qt

2009-12-20 17 views
29

में MouseMoveEvents प्राप्त करना मेरे प्रोग्राम में, जब भी माउस चलता है (यहां तक ​​कि जब यह दूसरी विंडो पर होता है) तो माउसमोवएवेंट (QMouseEvent * ईवेंट) होना चाहूंगा।Qt

अभी, मेरी mainwindow.cpp फ़ाइल में, मेरे पास है:

void MainWindow::mouseMoveEvent(QMouseEvent* event) { 
    qDebug() << QString::number(event->pos().x()); 
    qDebug() << QString::number(event->pos().y()); 
} 

लेकिन यह जब मैं क्लिक करें और कार्यक्रम में ही की खिड़की पर माउस को खींच जबकि केवल बुलाया जा रहा है। मैं

setMouseTracking(true); 
MainWindow के निर्माता में

बुला की कोशिश की है, लेकिन इस (mouseMoveEvent अभी भी केवल कहा जाता है जब मैं एक माउस बटन दबाए रखें, जहां यह है की परवाह किए बिना) कुछ अलग करने के लिए प्रतीत नहीं होता। दुनिया भर में माउस की स्थिति को ट्रैक करने का सबसे आसान तरीका क्या है?

उत्तर

32

आप एप्लिकेशन पर एक ईवेंट फ़िल्टर का उपयोग कर सकते हैं।

बूल मेनविंडो :: ईवेंटफिल्टर (QObject *, QEvent *) को परिभाषित और कार्यान्वित करें। उदाहरण के लिए

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::MouseMove) 
    { 
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); 
    statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mouseEvent->pos().y())); 
    } 
    return false; 
} 

मेनविंडोज़ का निर्माण होने पर ईवेंट फ़िल्टर इंस्टॉल करें (या कहीं और)। उदाहरण

MainWindow::MainWindow(...) 
{ 
    ... 
    qApp->installEventFilter(this); 
    ... 
} 
+1

धन्यवाद, जब माउस एप्लिकेशन विंडो पर होता है तो निरंतर अपडेट प्राप्त करने के लिए काम करता है, लेकिन यदि माउस कहीं और चलता है, तो स्थिति अपडेट नहीं होती है। – Switch

+0

खिड़की के बाहर माउस को ट्रैक करने के लिए, आपको माउस को पकड़ना होगा (QWidget :: grabMouse() देखें)। चूंकि सभी माउस ईवेंट विजेट पर भेजे जाएंगे, जिसने माउस को पकड़ लिया है, यह अन्य विगेट्स के साथ सामान्य बातचीत को रोक देगा, जब तक कि आप केवल माउस को ही नहीं लेते जब माउस खिड़की छोड़ देता है (leaveEvent() में) और फिर माउस को छोड़ दें enterEvent() पर। – baysmith

+0

grabMouse() जोड़ने के बाद, यह तब भी अपडेट होता है जब माउस एप्लिकेशन विंडो – Switch

1

के लिए मैं एक ही समस्या है, आगे तथ्य यह है कि मैं एक माउस चाल और कुछ भी नहीं होगा पर खिड़की से रंगना this->update() कॉल करने के लिए कोशिश कर रहा था ने और बढ़ा दिया था।

आप setMouseTracking(true) पर कॉल करके ईवेंट फ़िल्टर बनाने से बच सकते हैं @Kyberias ने नोट किया। हालांकि, यह vieport पर किया जाना चाहिए, न कि आपकी मुख्य विंडो स्वयं। (अपडेट के लिए ही चला जाता है)।

तो अपने कन्स्ट्रक्टर में आप एक लाइन this->viewport()->setMouseTracking(true) जोड़ सकते हैं और फिर इस फ़िल्टर को बनाने और इंस्टॉल करने के बजाय mouseMoveEvent ओवरराइड कर सकते हैं।

+0

एक QMainWindow में व्यूपोर्ट() विधि नहीं है। – user1482030

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