2008-10-10 1 views
3

Qt 대화 상자에 몇 개의 콤보 상자와 이중 스핀 상자가 있습니다. 이제 위젯 (스핀 상자 또는 콤보 상자)을 마우스 오른쪽 버튼으로 클릭 할 때 나타나는 메뉴에 "ResetToDefault"항목이 필요합니다.DoubleSpinBox 또는 ComboBox와 같은 Qt 위젯에서 사용자 정의 마우스 오른쪽 버튼 클릭 메뉴는 어떻게 만듭니 까?

어떻게받을 수 있습니까? 마우스 오른쪽 버튼을 클릭 할 때 나타나는 사용자 정의 메뉴를 가질 수있는 방법이 있습니까? 또는 마우스 오른쪽 버튼을 클릭하여 메뉴에 항목을 추가 할 수있는 방법이 있습니까?

답변

5

Qt4의 경우 가장 간단한 방법은 데이터를 재설정하는 작업을 만들고 addAction 메서드를 사용하여 위젯을 추가하거나 디자이너를 사용하는 것입니다. 그런 다음 contextMenuPolicy 특성을 Qt::ActionsContextMenu으로 설정하십시오. 상황에 맞는 메뉴가 나타나고 작업이 실행됩니다.

코드 예제 :

Qt3를 들어
QAction *reset_act = new QAction("Reset to default"); 
mywidget->addAction(reset_act); 
mywidget->setContextMenuPolicy(Qt::ActionsContextMenu); 
// here connect the 'triggered' signal to some slot 

, 당신은 상황에 맞는 메뉴 이벤트를 차단하고, 따라서 QSpinBox 등을 상속 할 수도 있습니다. 또는 메인 윈도우에서 컨텍스트 메뉴 이벤트를 가로 챌 수 있고, 컨텍스트 메뉴 (QWidget::childAt 메소드 사용)가 있어야하는 위젯에서 발생한 것인지 감지하여 표시 할 수 있습니다. 그러나 시험을해야 할 것입니다.

+0

입력 해 주셔서 감사합니다. 이미 나타나는 상황에 맞는 메뉴가 있다면 항목을 추가 할 수 있습니까? – AMM

+0

작업 목록을 사용하여 상황에 맞는 메뉴가 나타나면 작업을 추가하면 다른 항목 뒤에 항목이 자동으로 추가됩니다. 그렇지 않으면 더 까다 롭습니다. – PierreBdR

+0

편집 가능한 콤보 상자 및 스핀 상자의 상황에 맞는 메뉴는 QLineEdit 클래스에서 가져온 것으로 위젯의 작업으로 만들어지지 않습니다. –

1

Qt4의 경우, 편집 가능한 QComboBox에서 자신의 QLineEdit를 사용하여이 작업을 수행 할 수 있습니다. , 그 다음 ContextMenuEvent로

class MyLineEdit : public QLineEdit 
{ 
    Q_OBJECT 
public: 

    MyLineEdit(QWidget* parent = 0) : QLineEdit(parent){} 

    void contextMenuEvent(QContextMenuEvent *event) 
    { 
     QPointer<QMenu> menu = createStandardContextMenu(); 
     //add your actions here 
     menu->exec(event->globalPos()); 
     delete menu; 
    } 

}; 

를 구현하는 파생 QLineEdit 클래스를 작성 지금 라인 편집 클래스를 사용하는 라인 편집

MyLineEdit* edit = new MyLineEdit(); 
comboBox->setLineEdit(edit); 

에게 콤보 상자를 설정 QComboBox의 setLineEdit 기능을 사용합니다. createStandardContextMenu 함수는 일반 상황에 맞는 메뉴를 만들고 contextMenuEvent 핸들러가 표시되기 전에 원하는대로 새 액션을 추가 할 수 있습니다.

QComboBox를 편집 할 수없는 경우 기본 컨텍스트 메뉴가 없으므로 Qt :: ActionsContextMenu 메서드를 사용하는 것이 훨씬 간단합니다.

QAbstractSpinBox에는 setLineEdit 기능도 있으므로 비슷한 기술을 사용할 수 있습니다. 어떤 이유로 setLineEdit 함수는 QAbstractSpinBox에서는 보호되지만 QLineEdit에서는 public으로 보호됩니다.