2013-04-30 4 views
0

QSpinBox를 클릭하면 창을 열고 싶습니다. 문제는이 위젯에 대해 "클릭 된"신호가 존재하지 않는다는 것입니다. 누군가 그렇게 할 생각이 있습니까?QSpinBox의 신호 Qt

+0

왜 사용자가 스핀 상자 값을 변경하도록 하시겠습니까? QSpinBox는 * clicked * 시그널을 가지고 있지 않습니다. 사용자 정의 위젯이 필요한 것 같습니다. – zakinster

+0

촉각 응용 프로그램입니다. 사용자가 spinBow를 클릭했을 때 번호가 – federem

+0

인 숫자 패드 응용 프로그램을 열어 보겠습니다. 따라서 'QSpinBox'버튼을 사용하지 않으면 간단한 QLineEdit을 사용하지 않으시겠습니까? – zakinster

답변

1

QSpinBox은 입력 확인과 이벤트 처리라는 두 개의 버튼이있는 QLineEdit입니다. 은 마우스를 직접 다루기로되어 있기 때문에 신호를 클릭하지 않았습니다.

QSpinBox에서 파생 된 사용자 정의 위젯을 만들 때조차도 마우스 이벤트 자체를받지 못하기 때문에 충분하지 않은 문제는 자식 위젯에 의해 처리된다는 것입니다. 클릭 이벤트를 잡으려고 아이들 QSpinBox에 이벤트 필터를 설치할 수는 있지만 가장 깔끔한 방법은 아닙니다.

사용자가 상자를 선택할 때 숫자 패드 만 표시하려면 직접 QLineEdit을 사용할 수 있습니다. QSpinBox 버튼을 잃어 버릴 수 있지만 (필요한 경우 자신의 버튼을 추가 할 수 있습니다) 유효성 검사 (그러나 QValidator을 사용하여 자신을 추가 할 수 있습니다).

class MySpinBox: public QLineEdit 
{ 
    Q_OBJECT 

public: 
    MySpinBox(QWidget *parent = 0); 
    ~MySpinBox(); 

signals: 
    needNumpad(bool hasFocus); 

protected: 
    virtual void focusInEvent(QFocusEvent *e) { 
     QLineEdit::focusInEvent(e); 
     emit(needNumpad(true)); 
    } 
    virtual void focusOutEvent(QFocusEvent *e) { 
     QLineEdit::focusInEvent(e); 
     emit(needNumpad(false)); 
    } 
} 
0

당신은 이벤트 필터를 사용하고 같은 것을 할 수 있습니다 :

을 다음

그냥 focus 이벤트를 잡기 위해를 도출해야 키보드를 표시 할 사용자 정의 신호를 트리거

ui->spinBox->installEventFilter(this); 
QObjectList o_list = ui->spinBox->children(); 
for(int i = 0; i < o_list.length(); i++) 
{ 
    QLineEdit *cast = qobject_cast<QLineEdit*>(o_list[i]); 
    if(cast) 
     cast->installEventFilter(this); 
} 

그리고 이벤트 필터에서 마우스 클릭 (이 예제에서는 모든 마우스 버튼, 왼쪽 클릭, 오른쪽 클릭, 스크롤 휠 클릭 등으로 트리거 됨)을 확인합니다.

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if(event->type() == QEvent::MouseButtonPress) 
    { 
     showNumpadDialog(); 
    } 
    return false; 
} 
0

QLineEdit과 두 개의 버튼으로 나만의 QSpinBox를 만들 필요는 없습니다.

QLineEdit는 QSpinBox의 하위 항목이기 때문에. QLineEdit에 대한 이벤트 필터를 작성하고 해당 상위가 스핀 상자인지 여부를 점검 할 수 있습니다. 그러면 스핀 상자에 대한 클릭 이벤트가 발생합니다.

if(event->type() == QEvent::MouseButtonPress && dynamic_cast<QSpinBox *>(dynamic_cast<QLineEdit *>(obj)->parent()))