2011-12-02 2 views

답변

16

QWidgetAction을 서브 클래스화한 다음 addAction을 메뉴로 호출하면됩니다. 라벨

class SpinBoxAction : public QWidgetAction { 
public: 
    SpinBoxAction (const QString& title) : 
     QWidgetAction (NULL) { 
     QWidget* pWidget = new QWidget (NULL); 
     QHBoxLayout* pLayout = new QHBoxLayout(); 
     QLabel pLabel = new QLabel (title); 
     pLayout->addWidget (pLabel); 
     pSpinBox = new QSpinBox(NULL); 
     pLayout->addWidget (pSpinBox); 
     pWidget->setLayout (pLayout); 

     setDefaultWidget(pWidget); 
    } 

    QSpinBox * spinBox() { 
     return pSpinBox; 
    } 

private: 
    QSpinBox * pSpinBox; 
}; 

와 스핀 박스 행동

예제 코드는 이제 단순히 그것을 만들고

SpinBoxAction * spinBoxAction = new SpinBoxAction(tr("Action Title")); 
// make a connection 
connect(spinBoxAction ->spinBox(), SIGNAL(valueChanged(int)), 
     this, SLOT(spinboxValueChanged(int))); 
// add it to your menu 
menu->addAction(spinBoxAction); 
+0

QWidgetAction의 서브 클래 싱을 선호하는 이유는 무엇입니까? 'pWidget'과는 별도로 QWidgetAction을 인스턴스화하고'setDefaultWidget'을 호출하기 위해 느슨한 결합과 유지 보수가 용이 한 코드를 제공하지 않을까요? 'createWidget'을 구현하는 유일한 이유는 하위 클래스가 아니겠습니까? –

+0

다릅니다. 재사용 가능한 위젯 작업을 만들고 코드 작성을 위해 동일한 코드 부분을 다시 작성하지 않으려면 서브 클래스를 만들어야합니다. 예를 들어 레이블이있는 스핀 상자가 여러 개인 QMenu가 필요했고 최소/최대 값과 접두사가 다양했습니다. 'QWidgetAction'을 서브 클래스 화함으로써 재사용 가능한 요소를 가질 수 있었고 모든 경우에 생성자 인수 만 변경해야했습니다. 또한 액션 위젯을 갖춘 작은 라이브러리를 만들고 필요시 필요할 때 호출 할 수 있습니다. – pnezis

+0

나는 이런 종류의 생성자에 익숙하지 않다 :'SpinBoxAction (const QString & title) : QWidgetAction (NULL) {}' –

1

언제든지 QWidget 또는 QFrame을 메뉴 위젯으로 사용하고 QHBoxLayout을 넣고 안에 QWidgets을 넣을 수 있습니다.

+0

이 아이디어는 실제로 나에게 발생했습니다. 나는 다소 Qt를 처음 사용했기 때문에 조금이라도 용서해 준다. QWidget을 어떻게 메뉴 위젯으로 설정할 수 있을까? –

1

QWidgetActionQWidget 포함하는 QAction 당신의 메뉴에 추가합니다. 이것을 사용하여 QComboBox을 캡슐화하고 QMenu::addAction을 통해 메뉴에 추가 할 수 있습니다.

관련 문제