2012-04-29 22 views
13

Tôi đã nút khuyết tật X trong Qt từ thoại của tôi sử dụng dòng này:Làm cách nào để tắt tính năng đóng cửa sổ Alt + F4 bằng Qt?

myDialog->setWindowFlags(Qt::Dialog | Qt::Desktop) 

nhưng tôi không thể phát hiện Alt +F4 sử dụng mã này:

void myClass::keyPressEvent(QKeyEvent *e) 
{ 
    if ((e->key()==Qt::Key_F4) && (e->modifiers()==Qt::AltModifier)) 
     doSomething(); 
} 

gì nên làm gì để phát hiện Alt + F4 hoặc tắt tính năng này trong Qt?

Trả lời

24

Nhấn Alt+F4 kết quả trong sự kiện gần được gửi đến cửa sổ cấp cao nhất của bạn. Trong lớp cửa sổ của bạn, bạn có thể ghi đè lên closeEvent() để bỏ qua nó và ngăn đóng ứng dụng của bạn.

void MainWindow::closeEvent(QCloseEvent * event) 
{ 
    event->ignore(); 
} 

Nếu bạn để nút đóng (X) hiển thị, phương pháp này cũng sẽ vô hiệu hóa việc đóng ứng dụng của bạn.

Điều này thường được sử dụng để cung cấp cho ứng dụng một cơ hội để quyết định xem nó có muốn đóng hoặc không hoặc yêu cầu người dùng bằng cách hiển thị "Bạn có chắc chắn không?" hộp tin nhắn.

0

Ngoài ra bạn có thể xử lý các sự kiện trong lớp của hộp thoại của bạn (ít nhất là nếu nó là phương thức dlg):

void MyDialog::closeEvent(QCloseEvent* e) 
{ 
    if (condition) 
     e->ignore(); 
    else 
     __super::closeEvent(e); 
} 
3

Đoạn code dưới đây ngăn cản kết thúc hộp thoại khi nhấn Alt + F4, [X] hoặc Escape, nhưng không phải bằng cách gọi phương thức SomeDialog :: close().

void SomeDialog::closeEvent(QCloseEvent *evt) { 
    evt->setAccepted(!evt->spontaneous()); 
} 

void SomeDialog::keyPressEvent(QKeyEvent *evt) { 
    // must be overridden but empty if the only you need is to prevent closing by Escape 
} 

may mắn cho tất cả chúng ta;)

+0

Bạn đã có hai lỗi: nó là 'keyPressEvent (QKeyEvent * evt) '' Press' không 'Pressed' và loại là khác nhau. Nhưng với bản sửa lỗi này được áp dụng ... nó hoạt động tốt. :) –

+0

Chỉ cần ghi đè keyPressEvent (QKeyEvent * evt) và để trống, có thể gây ra các sự cố khác, chẳng hạn như không hoạt động. Nhập hành vi quan trọng có thể cần, ví dụ, khi chúng tôi muốn cho phép người dùng tiếp tục bằng cách bấm phím Enter. Vì vậy, nó là tốt hơn để xác định các phím chúng tôi không muốn cho phép một cách rõ ràng trong trường hợp cụ thể như vậy. Hoặc, nói cách khác, nó sẽ được khuyến khích để gọi BaseWidget :: keyPressEvent (evt) nơi BaseWidget là một cái gì đó được thừa kế (nó có thể là QWidget, QDialog, vv) –