Я хотел бы открыть окно, когда я буду писать в QSpinBox. Проблема в том, что для этого виджета не существует никакого сигнала, «щелкнутого» по нему. У кого-то есть идея сделать это?Signal clic on QSpinBox Qt
ответ
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));
}
}
Вы можете использовать фильтр событий и сделать что-то вроде этого:
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;
}
Вам не нужно создавать свой собственный QSpinBox с QLineEdit и двумя кнопками.
Поскольку QLineEdit является дочерним элементом QSpinBox. Вы можете создать фильтр событий для QLineEdit и проверить, является ли его родительский спинбокс. Тогда вы получите событие щелчка для окна со стрелкой.
if(event->type() == QEvent::MouseButtonPress && dynamic_cast<QSpinBox *>(dynamic_cast<QLineEdit *>(obj)->parent()))
Почему вы хотите открыть окно вместо того, чтобы позволить пользователю изменить значение спинбокса? QSpinBox не имеет * щелчка * сигнала, потому что они полагают, что справятся с этим сами. Похоже, вам нужен пользовательский виджет. – zakinster
Это тактильное приложение, поэтому, когда пользователь нажал на spinBow, я хочу открыть приложение numpad, чтобы он набрал номер – federem
Итак, если вы не используете кнопки 'QSpinBox', почему бы не использовать простой' QLineEdit'? – zakinster