2013-06-11 29 views
9

Tôi có một QGLWidget hiển thị cảnh OpenGL bên trong ứng dụng Qt. Tôi muốn thêm một số tiện ích con Qt mờ khác được phủ lên trên đầu trang của QGLWidget. Điều này khó khăn hơn so với các widget chuẩn vì bối cảnh vẽ OpenGL không được biết đến với các lớp họa sĩ của Qt. Vì vậy, nếu tôi chỉ làm điều rõ ràng và đặt một thanh công cụ trong suốt trên đầu trang của QGLWidget ví dụ, phần trong suốt của thanh công cụ thay vì ám màu đen (nó không có quyền truy cập vào bộ đệm khung OpenGL khi vẽ).Làm cách nào để ngăn không cho QWidget vẽ, nhưng vẫn phản ứng lại với các sự kiện?

Dường như cách được đề xuất để xử lý loại sự việc này là overpaint the 2D content after drawing the OpenGL scene. Ví dụ được liên kết có vẻ rất đơn giản, miễn là bạn chỉ vẽ các hình dạng đơn giản. Thay vào đó, những gì tôi muốn làm là trì hoãn bức tranh của một số trẻ em QWidget các đối tượng được thực hiện bên trong sự kiện sơn cho QGLWidget.

Vì vậy, vấn đề của tôi nắm này:

  1. Ngăn chặn lớp phủ QWidget s từ bức tranh trong bối cảnh bình thường, 2D.
  2. Trong trình xử lý sự kiện sơn cho QGLWidget, sơn lớp phủ sau khi vẽ cảnh 3D tạo nền.

Mục thứ hai trong danh sách này có vẻ đơn giản: Tôi có thể sử dụng QWidget::render() bên trong sự kiện sơn QGLWidget để vẽ các tiện ích mong muốn trên đầu khung nhìn. Điều này hoạt động tốt.

Mục đầu tiên phức tạp hơn: Tôi cần một cách để ngăn các vật dụng vẽ trong quá trình diễn ra sự kiện bình thường và chỉ vẽ chúng trong bộ xử lý sơn của QGLWidget. Một cách rõ ràng để làm điều này là ẩn các lớp phủ bằng cách sử dụng QWidget::hide(). Điều này cho phép tôi vẽ các vật dụng trên đỉnh cảnh OpenGL như tôi muốn. Tuy nhiên, vì các tiện ích bị ẩn, chúng không phản hồi các sự kiện chuột hoặc bàn phím. Ví dụ, tôi đang sử dụng QToolBar với một vài nút trên thanh công cụ và thanh công cụ được vẽ đúng cách nhưng không hoạt động (không có nút nào phản hồi nhấp chuột). Vì vậy, nếu đi xuống con đường này, có vẻ như tôi sẽ cần một cách để buộc các widget để vẫn đáp ứng với các sự kiện ngay cả khi nó được ẩn.

Một cách tiếp cận khác mà tôi đã thử là chặn sự kiện sơn QToolBar bằng bộ lọc sự kiện, với mục tiêu ngăn thanh công cụ tự vẽ. Tuy nhiên, thanh công cụ vẫn được hiển thị; Tôi giả định rằng điều này là do các nút khác nhau trên thanh công cụ là các tiện ích con vẫn được vẽ, ngay cả khi tôi chặn sự kiện sơn của phụ huynh.

Bất kỳ ý tưởng nào về cách tôi có thể hoàn thành mục tiêu của mình?

Trả lời

12

Tôi không hiểu rõ vấn đề của bạn, nhưng tôi sẽ cố gắng trả lời câu hỏi được nêu trong tiêu đề. Bạn nên sử dụng bộ lọc sự kiện. Cài đặt bộ lọc sự kiện bằng cách sử dụng widget->installEventFilter(object), trong đó widget là tiện ích bạn muốn chặn tranh và object là một đối tượng của bất kỳ lớp học có nguồn gốc từ QObject nào của bạn. Reimplement eventFilter của lớp học này:

bool MyClass::eventFilter(QObject* object, QEvent* event) { 
    if (event->type() == QEvent::Paint) { return true; } 
    return false; 
} 

Khi bạn trở lại đúng sự kiệnFilter, sự kiện được lọc và sơn không xảy ra.

Bạn cũng có thể thử sử dụng widget->setUpdatesEnabled(false) để tạm thời tắt tranh. Đừng quên kích hoạt lại khi bạn hoàn tất.