2010-02-04 30 views
9

Trong Qt, làm thế nào tôi có thể bỏ qua tất cả các sự kiện chuột và bàn phím và sau đó ngừng bỏ qua chúng? Tức là: bấm vào một nút, bỏ qua tất cả các sự kiện ở trẻ em; bấm lần nữa, không bỏ qua. Rõ chưa? tôi có những dòng sau, nhưng có lẽ tôi đang làm một cái gì đó sai:Bỏ qua các sự kiện chuột và bàn phím trong Qt

setAttribute(Qt::WA_TransparentForMouseEvents); 

setFocusPolicy(Qt::NoFocus); 
+0

Lưu ý: 'setAttribute (Qt :: WA_TransparentForMouseEvents);' - làm cho tiện ích trong suốt cho các sự kiện chuột; 'setEnabled (false);' - làm cho widget bỏ qua các sự kiện chuột và bàn phím (nhưng âm thầm tiêu thụ chúng vẫn còn, nó xuất hiện). – mlvljr

Trả lời

3

Bạn có thể sử dụng:

QWidget::setEnabled(false) 

nó vô hiệu hóa chuột và bàn phím các sự kiện cho một widget.

8

Bạn có thể sử dụng bộ lọc Sự kiện trên chuột và bàn phím của bạn sự kiện để lọc một số phím nhấn hoặc mouseclick khi bạn cần để:

yourWidget->installEventFilter(this); 

...

bool YourFrm::eventFilter(QObject* pObject, QEvent* pEvent) 
{ 
    if (pEvent->type() == QEvent::KeyPress) 
    { 
     QKeyEvent* pKeyEvent = static_cast<QKeyEvent*>(pEvent); 
     int PressedKey = pKeyEvent->key(); 

     if(PressedKey == Qt::Key_Return) 
     { 
      // Filter Return key.... 
      return true; 
     } 

     // standard event processing 
     return QObject::eventFilter(pObject, pEvent); 
    } 
    else if (pEvent->type() == QEvent::MouseButtonPress) 
    { 
     QMouseEvent* pMouseEvent = static_cast<QMouseEvent*>(pEvent); 

     ... // etc... 
    } 
    else 
    { 
     // standard event processing 
     return QObject::eventFilter(pObject, pEvent); 
    } 
} 

Mọi thông tin về vấn đề này: http://qt.nokia.com/doc/4.6/eventsandfilters.html

Hy vọng điều đó sẽ hữu ích!

4

Bạn có ý nghĩa với QGraphicsItem không?

Nếu có, bạn có thể gọi

void QGraphicsItem::setEnabled (bool enabled) 

Và để kích hoạt sự kiện sau, khi mặt hàng đó không nhận được sự kiện nữa, bạn phải vượt qua bởi the Scene, bởi vì bạn không thể nhận trực tiếp sự kiện trên mục.
Nếu vấn đề của bạn không sử dụng GraphicsView Frameworks, nhưng một phần khác của qt, nó gần như quá trình tương tự:
Bạn có thể gọi:

QWidget::setEnabled(false) //like Massimo said 

Để kích hoạt lại các widget, chỉ cần phát hiện buổi họp báo bên trong một đối tượng trong ứng dụng của bạn để có thể gọi `setEnable (true) trên widget của bạn!

Hy vọng điều đó sẽ hữu ích! `

8

Không sử dụng setFocusPolicy (Qt :: NoFocus); và nó sẽ truyền bá các sự kiện cho phụ huynh. Chỉ sử dụng setAttribute (Qt :: WA_TransparentForMouseEvents);

+0

Yay! Điều này làm việc cho QTableView của tôi mà tôi chỉ muốn sử dụng các điều khiển điều hướng bằng bàn phím. – TheGerm

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