2016-11-21 2 views
1

Я хотел бы получить положение мыши внутри моего QListWidget. Отслеживание прекрасное, когда мышь нависает над всеми остальными QWidgets - QMainWindow, QPushButton, CentralWidget и т. Д., За исключением QListWidget.Отслеживание мыши Qt не работает вообще, когда мышь нависает над QListWidget

с файла ++: test_1.cpp файл

#include "test_1.h" 
#include "ui_test_1.h" 

test_1::test_1(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::test_1) 
{ 
    ui->setupUi(this); 
    this->setMouseTracking(true); 
    ui->centralWidget->setMouseTracking(true); 
    ui->listWidget->setMouseTracking(true); 
    ui->pushButton->setMouseTracking(true); 


    ui->listWidget->addItem("aaa"); 
    ui->listWidget->addItem("bbb"); 
    ui->listWidget->addItem("ccc"); 
    ui->listWidget->addItem("ddd"); 
    ui->listWidget->addItem("eee"); 
} 

void test_1::mouseMoveEvent(QMouseEvent *event) 
{ 
    qDebug() << event->pos(); 
} 

test_1::~test_1() 
{ 
    delete ui; 
} 

Заголовок: test_1.h

#ifndef TEST_1_H 
#define TEST_1_H 

#include <QMainWindow> 
#include <QDebug> 
#include <QMouseEvent> 

namespace Ui { 
class test_1; 
} 

class test_1 : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit test_1(QWidget *parent = 0); 
    ~test_1(); 

private: 
    Ui::test_1 *ui; 
    void mouseMoveEvent(QMouseEvent*); 
}; 

#endif // TEST_1_H 

Главная: main.cpp

#include "test_1.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    test_1 w; 
    w.show(); 

    return a.exec(); 
} 

Выход:

QPoint(359,141) 
QPoint(358,141) 
QPoint(357,140) 
QPoint(356,140) 
QPoint(355,140) 
QPoint(354,139) 
QPoint(353,139) 
QPoint(352,139) 
QPoint(351,139) 

ответ

0

Правильный путь решения этой наследуется QListWidget и реализации void mouseMoveEvent(QMouseEvent *event)

Но есть и другой вариант, как installing фильтр событий на вашем QListWidget.

Добавить это в застройщик:

ui->listWidget->viewport()->installEventFilter(this); 

и реализовать фильтр событий:

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if(event->type() == QEvent::MouseButtonPress) 
    { 
     qDebug() << Q_FUNC_INFO << "QEvent::MouseButtonPress"; 
    } 
    if(event->type() == QEvent::MouseMove) 
    { 
     qDebug() << Q_FUNC_INFO << " pos: " << this->mapFromGlobal(QCursor::pos()); 
    } 
    return false; 
} 
+0

К сожалению, решение не работает для меня. Мне пришлось захватить мышь, чтобы сделать эту работу внутри QListWidget. –

+0

Не могли бы вы разместить свое решение в качестве ответа? – Tarod

1
void test_2::mouseMoveEvent(QMouseEvent *event) 
{ 
    QPoint p = event->pos(); 
    QRect widgetRect = ui->listWidget->rect(); 

    if(widgetRect.contains(p)) 
    { 
    qDebug() << "Inside"; 
    ui->listWidget->grabMouse(); 
    } 
    else 
    { 
    qDebug() << "Outside"; 
    ui->listWidget->releaseMouse(); 
    } 
} 
+0

Хорошая работа :) Счастливое кодирование! – Tarod

Смежные вопросы