Мне нужно нарисовать тире вместо нуля в QSpinBox
. Также мне нужно, чтобы клавиша штриховки нажала, нажав нулевую клавишу.Как нарисовать тире вместо нуля в QSpinBox?
Как это сделать?
Мне нужно нарисовать тире вместо нуля в QSpinBox
. Также мне нужно, чтобы клавиша штриховки нажала, нажав нулевую клавишу.Как нарисовать тире вместо нуля в QSpinBox?
Как это сделать?
Вы можете использовать setSpecialValueText()
;
QSpinBox spinBox;
spinBox->setSpecialValueText(tr("-"));
Вы можете проверить, если специальное значение выбирается путем подключения valueChanged(QString)
функции. Обратите внимание, что это отличается от valueChanged(int)
. Затем вы можете проверить значение переданной строки в слоте, и если оно равно специальному тексту, вы можете что-то сделать.
main()
{
connect(spinBox, SIGNAL(valueChanged(QString)), this, SLOT(doSomething(QString)));
}
void doSomething(QString valueStr)
{
if(valueStr == spinBox->specialValueText())
// Do something
else
//Convert valueStr to int and do other stuff
}
Или вы могли бы сделать что-то вроде этого:
main()
{
connect(spinBox, SIGNAL(valueChanged()), this, SLOT(doSomething()));
}
void doSomething()
{
if(spinBox->value() == 0)
// Do something with dash
else
//Do something with the value
}
Для другого вопроса, вам нужно создать keyPressEvent и проверить, если нажата клавиша тире или нет. Если это тире, вы можете вызвать другую функцию, чтобы что-то сделать. Edit: Кстати, индекс specialValueText()
0.
Редактировать: Или вы можете создать QShortcut
в своей основной функции.
new QShortcut(QKeySequence(Qt::Key_Minus), this, SLOT(doSomething()));
Редактировать продолжал: йоЗотеЬЫпд() является функцией слот. Поместите, например, void doSomething();
в раздел private slots:
вашего файла заголовка. А в файле CPP определить функцию, подобную этой:
void MainWindow::doSomething()
{
ui->spinBox->setValue(0);
//This is the slot called when you press dash.
}
Редактировать все еще продолжал: Вы должны объявить protected:
функцию в заголовке, как это:
virtual void keyPressEvent(QKeyEvent *event);
Затем вам нужно определите эту функцию в файле cpp. Например:
void MainWindow::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Minus)
ui->spinBox->setValue(0);
}
Вам не нужно подключать никакие сигналы или слоты для этой функции. Это событие.
Это означает, что при нажатии комбинации приборов ui->spinBox->setValue(0);
Из-за того, что вам нужно создать со счётчиком с диапазоном, начиная с 0.
spinBox->setRange(0, 100);
Это означает, что
if(spinBox->value() == 0)
//Then specialValueText is selected.
Спасибо! 'specialValueText' - именно то, что мне нужно. Теперь 'QSpinBox' также принимает тире, введенную клавиатурой! Но когда фокус лишен (или когда происходит что-то еще, что должно исправить новое значение), значение восстанавливается. Может быть, есть лучший способ принять тире, а затем использовать 'keyPressEvent'? – Ufx
Вы используете setValue()? –
Я имею в виду, вам нужно setValue (0); когда тире нажата. –