Сигнальный клик на QSpinBox Qt

Я хотел бы открыть окно, когда я нажимаю на QSpinBox. Проблема в том, что для этого виджета нет такого сигнала "кликнул".

Есть ли у кого-нибудь идеи, как это сделать?


person federem    schedule 30.04.2013    source источник
comment
Почему вы хотите открыть окно вместо того, чтобы позволить пользователю изменить значение счетчика? QSpinBox не имеет сигнала clicked, поскольку предполагается, что они сами обрабатывают его. Похоже, вам нужен пользовательский виджет.   -  person zakinster    schedule 30.04.2013
comment
Это тактильное приложение, поэтому, когда пользователь нажимает на spinBow, я хочу открыть приложение с цифровой клавиатурой, чтобы он мог ввести число.   -  person federem    schedule 30.04.2013
comment
Итак, если вы не используете кнопки QSpinBox, почему бы не использовать простую QLineEdit?   -  person zakinster    schedule 30.04.2013


Ответы (3)


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

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

Если вы просто хотите отображать цифровую клавиатуру, когда пользователь выбирает поле, вы можете напрямую использовать 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));
  }
}
person zakinster    schedule 30.04.2013

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

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;
}
person thuga    schedule 30.04.2013

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

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

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