2012-02-05 22 views
5

Tôi muốn triển khai cửa sổ thông báo bằng cách phân lớp QDialog. Nó phải ở trên các cửa sổ khác, nhưng tôi không muốn nó ăn cắp lấy nét từ các cửa sổ khác vì những lý do hiển nhiên. Tôi cũng lo ngại rằng nó sẽ can thiệp vào các ứng dụng toàn màn hình như video và trò chơi.Thực hiện các hộp thoại thông báo không lấy nét từ ứng dụng toàn màn hình?

Tôi làm cách nào để thực hiện việc này? Có bất kỳ chương trình phổ biến và thực hành UX nào mà tôi có thể muốn biết không?

Trả lời

0

Trước hết bạn cần phải tạo ra một non modal dialog:

Một hộp thoại modeless là một hộp thoại mà hoạt động độc lập với cửa sổ khác trong cùng một ứng dụng. Tìm và thay thế các hộp thoại trong các bộ xử lý văn bản thường không có điều kiện để cho phép người dùng tương tác với cả cửa sổ chính của ứng dụng và với hộp thoại.

Để đạt được điều đó, bạn cần gọi hàm show chứ không phải exec.

+0

Đúng nếu tôi sai, nhưng điều này chỉ làm cho cửa sổ hoạt động độc lập với cha mẹ của nó. Nó vẫn sẽ không ở trên đầu khi người dùng ALT + TAB. – Pieter

+0

Một QDialog là một cửa sổ cấp cao nhất. Bạn có thể sử dụng chức năng 'nâng cao 'nếu bạn muốn đảm bảo rằng nó sẽ ở trên cùng của ngăn xếp của tiện ích con. Sử dụng 'show', hộp thoại sẽ hiển thị và bạn sẽ có thể tương tác với các cửa sổ khác của ứng dụng. Nếu bạn muốn hiển thị hộp thoại trong suốt ứng dụng thì bạn có thể đặt cửa sổ chính làm cha mẹ của nó. Tôi không chắc chắn những gì xảy ra với ALT + TABs – pnezis

+0

Khi người dùng nhấn ALT + TAB (hoặc tập trung vào một cửa sổ toàn màn hình), QDialog không còn trên đầu trang của các cửa sổ khác. Đây không phải là hành vi mong muốn đối với thông báo [MSN Messenger-like] (http://www.donkhuth.com/wp-content/uploads/2007/01/saosang.jpg) giống như thông báo tôi đang cố gắng đạt được. – Pieter

1

đã không thử nó nhưng có vẻ như

my_dialog->setWindowFlags(Qt::CustomizeWindowFlags | ... | Qt::WindowStaysOnTopHint); 

nên làm việc, kết hợp với làm cho nó không chế độ.

+0

Tôi đã xóa điểm đánh dấu câu trả lời chính xác khỏi bài đăng của bạn vì đôi khi cửa sổ bật lên đánh dấu lấy nét từ cửa sổ hiện tại của tôi. Đây không phải là hành vi mong muốn.Làm thế nào tôi có thể tránh điều này? – Pieter

0

Dường như đây là một chủ đề cũ. Tuy nhiên, tôi không thấy ai đăng một câu trả lời thích hợp mà chỉ hoạt động, vì vậy tôi đang đăng giải pháp của mình cho cùng một vấn đề mà tôi đã gặp phải gần đây.

Trước hết, nếu bạn muốn hộp thoại không lấy cắp tiêu điểm từ các hộp thoại hoặc trường nhập khác, bạn nên đặt thuộc tính sau: Qt :: WA_ShowWithoutActivating. Sử dụng thuộc tính này, cửa sổ (hộp thoại cũng là một cửa sổ) sẽ được hiển thị mà không được kích hoạt. Sau đó, có lẽ bạn sẽ muốn tùy chỉnh hộp thoại của bạn theo nhu cầu của bạn, và bạn sẽ muốn hộp thoại này được hiển thị trên đầu trang. Vì vậy, các cờ cửa sổ sau đây có thể được thiết lập để đạt được kết quả như vậy trong một cách đa nền tảng: Qt :: FramelessWindowHint | Qt :: NoDropShadowWindowHint | Qt :: X11BypassWindowManagerHint | Qt :: Công cụ | Qt :: WindowStaysOnTopHint | Qt :: WindowTransparentForInput | Qt :: WindowDoesNotAcceptFocus.

Đoạn code dưới đây là một trong những ví dụ để đạt được một hộp thoại đó là modeless, và không ăn cắp tập trung từ bất cứ ai (giả sử thoại là một trỏ biến để thể hiện giá trị của QDialog):

dialog->setAttribute(Qt::WA_ShowWithoutActivating, true); 
dialog->setWindowFlags(dialog.windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::X11BypassWindowManagerHint | Qt::Tool | Qt::WindowStaysOnTopHint | Qt::WindowTransparentForInput | Qt::WindowDoesNotAcceptFocus); 
Các vấn đề liên quan