Thông tin không liên quan: Tôi đang cố gắng xây dựng một ứng dụng bằng Qt. Ứng dụng này có một QMdiArea và một cửa sổ con. Cửa sổ con của tôi sẽ có một trình đơn có thể được tích hợp vào QMdiArea hoặc tách biệt và gắn liền với chính đứa trẻ đó. Mặc dù, chi tiết này có chi tiết hơn một chút so với yêu cầu ...Qt - Xóa phím tắt - Quá tải tắt không rõ ràng
Sự cố: Tôi muốn tiện ích con của tôi có menu có phím tắt "CTRL + W". Nhưng, vì tôi đang sử dụng một QMdiArea, các phím tắt đã được sử dụng gây ra:
QAction :: eventFilter: mơ hồ quá tải shortcut: Ctrl + W
Làm thế nào tôi có thể thoát khỏi shortcut này và tuyên bố nó trong tiện ích con của tôi thay thế?
Cập nhật: Dưới đây là những gì tôi đã cố gắng không có may mắn:
class MDI : public QMdiArea
{
Q_OBJECT
private:
bool event(QEvent *tEvent)
{
if (tEvent->type() == QEvent::KeyPress)
{
QKeyEvent* ke = static_cast<QKeyEvent*>(tEvent);
if (ke->key()== Qt::Key_W && ke->modifiers() & Qt::ControlModifier)
emit KeyCW();
return true;
}
return QMdiArea::event(tEvent);
}
public:
signals:
void KeyCW();
};
này hoạt động nếu tôi làm điều gì đó đơn giản như thay đổi Qt::Key_W
-Qt::Key_L.
Chìa khóa-combo được nhận và sự kiện được ném . Với W, nó không bao giờ xảy ra. Tôi cũng đã thử di chuyển event
sang QMainWindow cũng như một EventFilter trong subwindow tới QMdiArea. Dường như nó hơi quá phức tạp để làm điều gì đó đơn giản như loại bỏ các trình xử lý khóa mặc định từ bên trong QMdiArea.
Vậy là không có cách nào để vô hiệu hóa các phím tắt mà QMdiArea tạo?Về cơ bản có nghĩa là nếu tôi muốn sử dụng khóa cắt ngắn, tôi phải sử dụng các kết nối tín hiệu/khe giữa hai thiết bị? – Serodis
Ngoài ra, nếu đó là cách tuyệt đối duy nhất, có bất kỳ tác hại nào trong việc rời khỏi lối tắt không rõ ràng không? IE: Cài đặt phím tắt trên menu widget? Tôi thực sự không muốn hy sinh lời nhắc phím tắt "Ctrl + W" trong thanh menu, vì đó là cách tốt nhất để cho người dùng biết chức năng phím tắt. – Serodis
Để thay đổi hành vi mặc định của 'QMdiArea' liên quan đến một sự kiện quan trọng cụ thể là phân lớp nó và thực hiện lại' keyPressEvent() '. Một cách khác là sử dụng bộ lọc sự kiện. – Arlen