2010-01-12 26 views
7

Chúc mừng,Cách triển khai menu "Chỉnh sửa" với "Hoàn tác", "Cắt", "Dán" và "Sao chép"?

cho một trong các ứng dụng của tôi Tôi đang cố triển khai thực đơn "Chỉnh sửa". Menu này thường có các mục nhập chuẩn Hoàn tác, Cắt, Sao chépDán.

Menu này là không có theo mặc định và người dùng dường như mong đợi nó đặc biệt trên Mac OS X.

Có cách nào dễ dàng hơn một thực hiện điều này, mà không cần làm như vậy trong mỗi widget cách thủ công? Vì hầu hết các tiện ích đều có cơ chế sao chép/dán/hoàn tác đã được triển khai thông qua các phím tắt, tôi muốn cung cấp một vài thao tác menu đơn giản gọi chúng là tốt.

Các hành động nên gọi bất kỳ tiện ích con nào có trọng tâm đầu tiên, sau đó chúng sẽ chuyển các sự kiện lên trên chuỗi đối tượng, tôi đoán vậy.

Tôi đang sử dụng Qt 4.6 trên Windows, Linux và Mac OS X.

Cảm ơn!

Trả lời

6

Thật dễ dàng để thực hiện một nửa chức năng cần thiết. Chỉ cần tạo menu Edit, cùng với các QActions cần thiết (copy/paste/undo/etc.) Trong lớp cửa sổ chính của bạn và kết nối chúng với các khe. Trong các vị trí, mô phỏng các sự kiện báo chí và phát hành chính xác (ví dụ: Ctrl + C cho Sao chép) và gửi chúng đến tiện ích con hiện đang được tập trung. Trong mã, một cái gì đó như thế này:

MainWindow::MainWindow(...) 
{ 
    ... 
    connect(actionCopy, SIGNAL(triggered()), SLOT(copy())); 
    ... 
} 
... 
void MainWindow::copy() 
{ 
    QWidget* focused = QApplication::focusWidget(); 
    if(focused != 0) 
    { 
     QApplication::postEvent(focused, 
           new QKeyEvent(QEvent::KeyPress, 
               Qt::Key_C, 
               Qt::ControlModifier)); 
     QApplication::postEvent(focused, 
           new QKeyEvent(QEvent::KeyRelease, 
               Qt::Key_C, 
               Qt::ControlModifier)); 
} 

Tất nhiên, đây là một hack. Bạn cần phải sửa đổi mã cho mỗi nền tảng đích, thay đổi các phím tắt cho các nền tảng chính xác và có thể xảy ra rằng một tiện ích nhận tiêu điểm thực hiện điều gì đó không mong muốn với Ctrl + C. Nhược điểm tồi tệ nhất trong phương pháp này, theo ý kiến ​​của tôi, là bạn không thể kiểm soát đúng trạng thái đã bật của các mục menu Chỉnh sửa. Không thể truy vấn từ một tiện ích chung cho dù có thể thực hiện thao tác sao chép hoặc dán hay không.

Tôi không thể tìm ra giải pháp thực sự cho vấn đề này - và sẽ ngạc nhiên khi biết rằng một giải pháp tồn tại - vì chức năng sao chép/dán thường ẩn bên trong mã của lớp và không được hiển thị thông qua bất kỳ bộ tín hiệu chuẩn nào/slots. Sau các thí nghiệm tối nay với chức năng này, tôi đã quyết định chỉ quên một menu Chỉnh sửa từ ứng dụng của mình và mong muốn người dùng biết các phím tắt hoặc sử dụng các menu ngữ cảnh nhạy cảm.

+1

Tin tức khủng khiếp. Cảm ơn mặc dù – aehlke

0

Hiển thị của tôi là trình đơn Chỉnh sửa áp dụng cho tiện ích con tài liệu trung tâm, không tải các tiện ích con nhỏ. Tôi chưa thử nghiệm, nhưng nếu bạn có một biểu mẫu với QLineEdits, menu Edit (trong thanh menu) có thực sự áp dụng cho widget đó không. Bạn không đơn giản đưa lên trình đơn ngữ cảnh hoặc bấm các đường cắt ngắn để truy cập các tùy chọn này ...

+2

Điều đó có thể đúng đối với Windows/Linux như trình quản lý cửa sổ. Tuy nhiên, trên OS X, bạn có thanh menu ứng dụng ở đầu màn hình chứ không phải ở đầu mỗi cửa sổ. Và người dùng Mac mong đợi tác vụ menu được chọn có hiệu lực trên cửa sổ trên cùng và tiện ích con hiện có tiêu điểm. (Việc chọn dán sẽ dán bất kỳ nội dung gì vào clipboard vào QLineEdit hiện có tiêu điểm, vv) – BastiBen

0

giải pháp của người dùng285740 không giúp tôi, vì tôi đang sử dụng điều khiển trình duyệt trong ứng dụng của mình (CEF hoặc WebKit, không quan trọng).

Tại sao? Đối với trình duyệt, focusWidget() luôn có vẻ là NULL, vì các phần tử <input> không phải là tiện ích con. Tôi đã thử postEvent() cho các tiện ích con khác - không hoạt động. Việc thêm các mục trình đơn có số QAction::TextHeuristicRole + các chuỗi chuẩn như QKeySequence::Copy cũng không thực hiện được công việc (tôi chỉ có thể kết nối chúng với các vị trí của mình, không được kết nối với các vùng tiêu chuẩn). Cefclient mẫu tải một tập tin xib, nhưng nó không phải là một lựa chọn cho tôi, kể từ khi Qt tạo ra tất cả mọi thứ từ đầu.

Cuối cùng, tôi đã tìm ra giải pháp! Tạo các mục menu giống nhau từ mã ObjectiveC++. Họ hành động như những người tạo ra thông qua QMenuBar, nhưng họ có thể được kết nối với một số hành động tự động thực như @selector(copy:)

Bạn có thể tìm thấy một ví dụ ở đây (!): nsMenuUtilsX::GetStandardEditMenuItem(), chỉ cần làm điều đó từ ++ mã ObjC của bạn.

Nhưng mã này không hoạt động nếu bạn thực thi trước QApplication::exec(). Qt sau đó "viết lại" menu chính theo chương trình ... Cách sửa lỗi đó? Vâng, có lẽ tôi sẽ thêm một số hack như một QTimer. Nó không làm điều đó nếu bạn không cố gắng để thêm một mục khác thông qua QMenuBar. OK rồi! Menu độc lập Qt.

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