Я хотел бы открыть окно, когда я нажимаю на QSpinBox
. Проблема в том, что для этого виджета нет такого сигнала "кликнул".
Есть ли у кого-нибудь идеи, как это сделать?
Я хотел бы открыть окно, когда я нажимаю на QSpinBox
. Проблема в том, что для этого виджета нет такого сигнала "кликнул".
Есть ли у кого-нибудь идеи, как это сделать?
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));
}
}
Вы можете использовать фильтр событий и сделать что-то вроде этого:
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 и проверить, является ли его родитель счетчиком. Тогда вы получите событие click для счетчика.
if(event->type() == QEvent::MouseButtonPress && dynamic_cast<QSpinBox *>(dynamic_cast<QLineEdit *>(obj)->parent()) )
QSpinBox
, почему бы не использовать простуюQLineEdit
? - person zakinster   schedule 30.04.2013