2010-01-12 4 views
7

인사말, 내 응용 프로그램 중 하나에 대해"실행 취소", "잘라 내기", "붙여 넣기"및 "복사"를 사용하여 "편집"메뉴를 구현하는 방법은 무엇입니까?

"편집"메뉴를 구현하려고합니다. 이 메뉴는 보통 을 실행 취소, 잘라 내기, 복사붙여 넣기입니다. 수동으로 모든 위젯에 그렇게하지 않고,이를 구현하는 쉬운 방법이

이 메뉴는 기본적으로 존재하지 않고, 사용자가 특히 맥 OS X의

에 기대하는 것이 있습니까? 대부분의 위젯에는 바로 가기를 통해 이미 구현 된 복사/붙여 넣기/실행 취소 메커니즘이 있기 때문에이를 호출하는 몇 가지 간단한 메뉴 작업을 제공하고자합니다.

조치는 먼저 포커스가있는 위젯을 호출해야합니다. 그런 다음 이벤트는 오브젝트 체인 위로 이벤트를 전달해야합니다.

내가

감사 윈도우, 리눅스 및 Mac OS X의에 Qt는 4.6을 사용하고 있습니다!

답변

6

필요한 기능의 절반을 수행하기는 쉽습니다. 기본 창 클래스에서 필요한 QActions (복사/붙여 넣기/실행 취소/etc.)와 함께 편집 메뉴를 작성하여 슬롯에 연결하십시오. 슬롯에서 올바른 키 누르기 및 놓기 이벤트 (예 : 복사의 경우 Ctrl + C)를 에뮬레이트하고 현재 포커스가있는 위젯으로 전송합니다. 코드에서 다음과 같이됩니다.

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)); 
} 

물론 이것은 상당히 해킹입니다. 키보드 단축키를 올바른 대상으로 변경하면 각 대상 플랫폼의 코드를 수정해야하며, 포커스를받는 위젯이 Ctrl + C를 사용하여 예기치 않게 조용하게 수행 할 수도 있습니다. 내 생각에이 방법의 최악의 단점은 편집 메뉴 항목의 활성화 된 상태를 제대로 제어 할 수 없다는 것입니다. 복사 또는 붙여 넣기 작업의 가능 여부는 일반 위젯에서 쿼리 할 수 ​​없습니다.

복사/붙여 넣기 기능이 일반적으로 클래스 코드 내에 숨겨져 있고 표준 신호 세트를 통해 노출되지 않으므로이 문제에 대한 실제 해결책을 찾을 수 없습니다./slots. 기능에 대한 오늘 밤의 실험이 끝나면 내 응용 프로그램에서 편집 메뉴를 사용하는 것을 잊어 버리고 사용자가 키보드 단축키를 알거나 상황에 맞는 메뉴를 사용하기를 기대합니다.

+1

끔찍한 소식입니다. 그래도 고마워 – aehlke

0

내 생각에 편집 메뉴는 작은 문서로드가 아닌 중앙 문서 위젯에 적용됩니다. 테스트하지는 않았지만, QLineEdits가있는 폼이 있다면 메뉴 바의 편집 메뉴가 실제로 그 위젯에 적용됩니다. 컨텍스트 메뉴를 불러 오지 않거나 단축키를 눌러 간단히이 옵션에 액세스하지 마십시오.

+2

윈도우 매니저처럼 윈도우/리눅스에서도 마찬가지 일 수 있습니다. 그러나 OS X에서는 각 창 상단이 아닌 화면 상단에 응용 프로그램 전체 메뉴 모음이 있습니다. 그리고 Mac 사용자는 선택한 메뉴 조치가 현재 포커스가있는 최상위 창과 위젯에 영향을 미칠 것으로 예상합니다. (붙여 넣기를 선택하면 현재 포커스가있는 QLineEdit에 클립 보드에있는 내용이 붙여 넣어집니다.) – BastiBen

0

내 앱 (CEF 또는 WebKit, 중요하지 않음)에서 브라우저 컨트롤을 사용하고 있기 때문에 user285740의 솔루션이 도움이되지 않았습니다.

왜? 브라우저의 경우 focusWidget()은 인 것 같습니다. <input> 요소는 위젯이 아니기 때문입니다. 다른 위젯에 postEvent()을 시도했지만 작동하지 않았습니다. QAction::TextHeuristicRole + QKeySequence::Copy과 같은 표준 시퀀스를 사용하여 메뉴 항목을 추가해도 작업을 수행하지 못했습니다 (표준 슬롯이 아닌 내 슬롯에만 연결할 수 있음). Cefclient 샘플은 xib 파일을로드하지만, Qt는 처음부터 모든 것을 생성하기 때문에 저에게는 옵션이 아닙니다.

결국 해결책을 찾았습니다! ObjectiveC++ 코드에서 동일한 메뉴 항목을 만듭니다. 그들은 QMenuBar하지만 통해 생성 된 것과 같은 행동들은 @selector(copy:)

처럼 진짜 자동 작업에 연결할 수 있습니다 당신은 여기에서 예를 찾을 수 있습니다 (!) : nsMenuUtilsX::GetStandardEditMenuItem()를, 당신의 ObjC++ 코드에서 그렇게.

그러나이 코드는 QApplication::exec() 전에 실행하면 작동하지 않습니다. Qt는 메인 메뉴를 프로그래밍 방식으로 "재 작성"합니다 ... 어떻게 해결할 수 있습니까? 어쩌면 QTimer와 같은 해킹을 추가 할 것입니다. QMenuBar를 통해 다른 항목을 추가하지 않으려는 경우에는 그렇게하지 않습니다. 이제 괜찮아! Qt 독립 메뉴.

관련 문제