2009-08-27 28 views
5

Tôi có ứng dụng MDI được viết bằng Qt. Một số cửa sổ phụ bao gồm QGLWidget s, tức là ngữ cảnh OpenGL. Điểm nổi bật nhất trong số này là sử dụng các vertex của OpenGL và các phần shader fragment để hiển thị dữ liệu của chúng.Ứng dụng Qt MDI với OpenGL: cách lấy ảnh chụp màn hình hợp lệ?

tôi cần phải lập trình chụp ảnh màn hình của cửa sổ chính của ứng dụng, bao gồm tất nhiên tất cả các subwindows điều đó xảy ra để được nhìn thấy. Âm thanh dễ dàng lúc đầu ("chắc chắn đã được hỏi nhiều lần, vì vậy hãy chỉ google nó!"), Nhưng sau khi một cái nhìn gần hơn nó có vẻ là nhận được một chút khôn lanh ...

Bây giờ đây là những gì tôi đã cố gắng cho đến nay :

  1. QPixmap::grabWidget không hoạt động cho các cửa sổ phụ sử dụng các chương trình đổ bóng, rõ ràng vì ngữ cảnh chuyển hướng dường như không hỗ trợ các tiện ích OpenGL cần thiết. (Mã vẽ kiểm tra rằng bối cảnh liên quan đến hỗ trợ các phần mở rộng cần thiết, và từ chối để tiếp tục nếu không muốn nói.)
  2. QPixmap::grabWindow âm thầm rời khỏi tất cả các bối cảnh OpenGL trống - ngay cả những người sử dụng nguyên thủy cơ bản mà thôi.
  3. QGLWidget::grabFrameBuffer hoạt động, nhưng chỉ ghi lại ngữ cảnh OpenGL của cửa sổ phụ cụ thể, trong khi tôi muốn lấy toàn bộ ứng dụng (về cơ bản những gì Alt+PrtScr thực hiện trong Windows).

Tôi cũng đã thử làm # 2 đầu tiên và sau đó lặp # 3 cho tất cả các cửa sổ phụ, chỉ cần sao chép kết quả của # 3 vào đúng vị trí của hình ảnh từ # 2. Điều này làm việc rất tốt, cho đến khi tôi thực hiện một số subwindows chồng lên nhau - trong trường hợp này các hình ảnh từ # 3 ghi đè lên các khung subwindow, vv Vì vậy, phương pháp này có lẽ sẽ đòi hỏi mã nhiều hơn nữa để xử lý tất cả các trường hợp góc khó chịu ...

một số nền thêm: Khi tôi nhận được ảnh chụp màn hình, tôi sẽ đưa một số trong số họ trong một seqence để tạo ra một video - có lẽ sử dụng ffmpeg. Điều đó làm cho câu hỏi này trở thành một dạng tiếp nối (phần đầu tiên) my previous question; nó chỉ là ứng dụng đã phát triển từ một chương trình OpenGL độc lập theo ngữ cảnh duy nhất đến một cái gì đó sử dụng Qt cho cửa sổ tổng thể và tiện ích con giao diện người dùng và nhúng đồ họa trong cửa sổ phụ.

Trong khi tôi sẽ đương nhiên muốn có một tốt đẹp, giải pháp đa nền tảng Qt-ish, tôi sẵn sàng xem xét phải dùng đến một hack đặc trưng cho Windows, quá. (Mà nên là có thể, như tôi có thể thấy Alt+PrtScr làm rất nhiều điều đúng.)

Vì vậy, bất cứ đề nghị?

Trả lời

2

Rất bướng bỉnh, nhưng chụp máy tính để bàn (không che giấu cửa sổ của bạn) như trong this tutorial và cắt xén mọi thứ nhưng cửa sổ của bạn hoạt động?

Nói chung, tôi thậm chí không chắc chắn rằng thông số OpenGL yêu cầu đầu ra phải được đặt trong bộ đệm phía trước: việc triển khai chỉ có thể sử dụng lớp phủ video (hoặc đầu đọc qua cổng Voodoo2-esque VGA) cho đầu ra.

+0

Nó * làm * việc! Tại sao tôi không thể tự mình nghĩ về điều này? ...Hạn chế duy nhất tôi thấy là điều này về cơ bản hơi chậm hơn khi so sánh với việc chỉ lấy cửa sổ quan tâm. Điều này có thể trở nên có liên quan, bởi vì tôi thực sự đang cố gắng lấy một video. Nhưng tôi vẫn chấp nhận câu trả lời, bởi vì nó chính xác những gì tôi yêu cầu - cảm ơn bạn rất nhiều! – Reunanen

1

Điều duy nhất tôi có thể nghĩ ra khỏi tay là làm theo ý psuedocode sau:

for each window 
    grab the window into its own pixmap 
    grab the GL portions and paste into the windows 
order the window pixmaps by depth of the window (deepest first) 
initialize a common pixmap 
for each window pixmap 
    paint the window pixmap into the common pixmap at the appropriate location. 
+0

Tôi đồng ý rằng điều này sẽ hoạt động, do đó +1. Nhưng ít nhất là bây giờ, tôi sẽ đi theo con đường lười biếng :) – Reunanen

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