2013-04-30 3 views
0

Я хотел бы открыть окно, когда я буду писать в QSpinBox. Проблема в том, что для этого виджета не существует никакого сигнала, «щелкнутого» по нему. У кого-то есть идея сделать это?Signal clic on QSpinBox Qt

+0

Почему вы хотите открыть окно вместо того, чтобы позволить пользователю изменить значение спинбокса? QSpinBox не имеет * щелчка * сигнала, потому что они полагают, что справятся с этим сами. Похоже, вам нужен пользовательский виджет. – zakinster

+0

Это тактильное приложение, поэтому, когда пользователь нажал на spinBow, я хочу открыть приложение numpad, чтобы он набрал номер – federem

+0

Итак, если вы не используете кнопки 'QSpinBox', почему бы не использовать простой' QLineEdit'? – zakinster

ответ

1

A QSpinBox всего лишь QLineEdit с двумя кнопками, проверкой ввода и обработкой событий. У него нет , а нажал сигнал, потому что он должен обрабатывать мышь даже сам.

Проблема в том, что даже создание пользовательского виджета, полученного из QSpinBox, будет недостаточным, так как оно не принимает события мыши непосредственно, они обрабатываются его дочерними виджетами. Вы можете установить фильтр событий для детей QSpinBox, чтобы поймать событие щелчка, но это не самый аккуратный способ.

Если вы просто хотите отобразить numpad, когда пользователь выберет поле, вы можете использовать его непосредственно QLineEdit. Вы потеряете кнопки QSpinBox (но вы можете добавить свои собственные, если они вам понадобятся) и проверку (но вы можете добавить свою собственную, используя QValidator).

Тогда вы просто должны получить его, чтобы поймать focus событие, вызвать пользовательский сигнал, который будет показывать клавиатуру:

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

Вы можете использовать фильтр событий и сделать что-то вроде этого:

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

Вам не нужно создавать свой собственный QSpinBox с QLineEdit и двумя кнопками.

Поскольку QLineEdit является дочерним элементом QSpinBox. Вы можете создать фильтр событий для QLineEdit и проверить, является ли его родительский спинбокс. Тогда вы получите событие щелчка для окна со стрелкой.

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