2015-02-07 5 views

ответ

2

Вы можете использовать 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. 
+0

Спасибо! 'specialValueText' - именно то, что мне нужно. Теперь 'QSpinBox' также принимает тире, введенную клавиатурой! Но когда фокус лишен (или когда происходит что-то еще, что должно исправить новое значение), значение восстанавливается. Может быть, есть лучший способ принять тире, а затем использовать 'keyPressEvent'? – Ufx

+0

Вы используете setValue()? –

+0

Я имею в виду, вам нужно setValue (0); когда тире нажата. –