2013-05-26 33 views
6

Tôi gặp sự cố trong PySide khi cố gắng xác định nút chuột nào được nhấn trong chức năng sự kiện. Tôi cần nó đặc biệt cho bỏ qua sự kiện di chuyển chuột, bởi vì nó làm công việc trên cả hai nút chuột, trái và phải.Qt cách kiểm tra nút bấm nào được nhấn

Tôi muốn bỏ qua sự kiện di chuyển chuột nếu nhấn nút phải trên cảnh. Bất kỳ giúp đỡ?

Trả lời

14

Tất cả các sự kiện chuột có hai phương pháp (buttonbuttons) để xác định các nút được nhấn. Nhưng chỉ với move sự kiện tài liệu cho biết:

Lưu ý rằng giá trị trả về luôn là Qt :: NoButton cho sự kiện di chuyển chuột.

cho mouseMoveEvent bạn nên sử dụng phương pháp buttons.

void mouseMoveEvent(QMouseEvent *e) 
{ 
    if(e->buttons() == Qt::RightButton) 
     qDebug() << "Only right button"; 
} 

Để bỏ qua các sự kiện di chuyển bạn cần thực hiện công việc này trong eventFilter tất nhiên.

+0

Đó là những gì tôi cần. Cảm ơn bạn rất nhiều. Tôi sẽ mở câu hỏi mới cho eventFilter nếu bạn có thể giúp tôi bằng cách lọc chuột. – Alex

+0

@Alex bạn được chào đón, tôi sẽ thấy câu hỏi của bạn về 'eventFilter' càng sớm càng tốt, nhưng tôi chỉ có thể cung cấp cho bạn mã C++. – fasked

+0

Được đăng tại đây: http://stackoverflow.com/questions/16772227/qt-mouse-event-propagation-with-scene-items – Alex

1

bạn có thể kiểm tra, nút chuột nào được nhấn qua Qt::RightButton. Xin lỗi vì C++ mã, nhưng tôi hy vọng, bạn sẽ hiểu được ý tưởng anyway:

void mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button()==Qt::RightButton){ 
     qDebug() << "right button is pressed 
    } 
} 
+1

Bình chọn cho sự tham gia của bạn, nhưng tôi đã thử điều này, và trong khi nó hoạt động với việc nhấn chuột và thả chuột, nó không hoạt động trong sự kiện MOUSE MOVE. – Alex

+0

Điều này không hiệu quả đối với tôi. Widget nhận 'QContextMenuEvent' thay vì' QMouseEvent' bất kể tôi làm gì - mặc dù tôi không có menu, và cố gắng sử dụng 'setContextMenuPolicy' không thay đổi gì cả. –

2

Bạn có thể sử dụng một boolean:

void mousePressEvent(QMouseEvent *event) 
{ 
if (event->button()==Qt::RightButton){ 
    qDebug() << "right button is pressed 
    pressed=true; //<----- 
} 
} 

và trên mouseMoveEvent

void GLWidget::mouseMoveEvent(QMouseEvent *event) 
{ 

float dx = event->x() - lastPos.x();  // where lastpos is a QPoint member 
float dy = event->y() - lastPos.y(); 

if (dx<0) dx=-dx; 
if (dy<0) dy=-dy; 

if (event->buttons() & Qt::LeftButton) { //if you have MOVEd 

    ...do something 

} 

if (event->buttons() & Qt::RightButton) { 

    if (pressed==true) return; 
    else{ 
    ...do 
    } 
} 
} 

On mouserelease bạn phải set pressed = false; ("Ép" phải là thành viên của lớp)

Hy vọng nó giúp, cho tôi biết

+0

+1 để thử, nhưng đó không phải là những gì tôi cần. Tôi sẽ không đặt boolean cho rằng vấn đề, quá nguy hiểm khi người dùng là vụng về với con chuột ... đã nhận thấy rằng Qt không phải là tốt nhất với xử lý sự kiện chuột. Tôi chắc chắn rằng có phương pháp tích hợp cho mục đích đó. – Alex

+0

Điều này dường như không hoạt động đúng cách, nó dường như chỉ lấy nút chuột nếu câu lệnh đọc: 'if (event-> buttons() == Qt :: LeftButton)' ví dụ, thay vì 'button()' . –

6

QApplication::mouseButtons() sẽ trả về trạng thái mouseButton, vì vậy, bạn có thể nhận trạng thái của chuột trong KeyPressEvent.

Các vấn đề liên quan