2013-11-29 8 views
3

У меня есть виджет, содержащий QSpinBox. Этот виджет также имеет QVector<int> Values. То, что я хотел бы сделать, это получить QSpinBox для отображения значений, выданных от Values только.Задайте определенные значения в QSpinBox

Сначала я подумал, что новый слот и сигнал в моем виджете будет делать трюк, что-то вроде

слот:

void ChangeSomeValue() 
{ 
    // QVector<int> Values; 
    // int Index; 
    int val = Values[ Index ]; 
    emit(SomeValueChanged(val)); 
} 

соединяет:

connect(UI->MySpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeSomeValue())); 
connect(this, SIGNAL(SomeValueChanged(int)), UI->MySpinBox, SLOT(setValue(int))); 

Но тогда несколько проблем возникают:

  1. QSpinBox испускает другой valueChanged после того, как я вызываю его setValue, что приводит к бесконечному циклу (пока мой QVector не взрывается).
  2. Мне все еще нужно найти способ отслеживания Индекса, в зависимости от того, какая из стрелок QSpinBox была нажата (вверх или вниз). Я даже не думаю, что это возможно).

Таким образом, мое решение, с его проблемами, похоже, является тупиком. Есть идеи?. Я бы хотел придерживаться QSpinBox, если это возможно.

Спасибо!

[EDIT]

подклассов:

class SpinBox : public QSpinBox 
{ 
    Q_OBJECT 
public: 
    explicit SpinBox(const QVector<int> & values, QWidget * parent = 0) : 
     QSpinBox(parent), 
     mValues(values), 
     mIndex(0) 
    { 
     qSort(mValues); 
     setMinimum(mValues.at(0)); 
     setMaximum(mValues.at(mValues.size() - 1)); 
     setValue(mValues.at(0)); 
    } 

protected: 
    void stepBy(int steps) // re-implementaion 
    { 
     mIndex += steps; 
     mIndex = qBound(0, mIndex, mValues.size() - 1); 
     setValue(mValues.at(mIndex)); 
    } 

private: 
    QVector<int> mValues; 
    int    mIndex; 
}; 

ответ

4

Я хотел бы предложить писать свой собственный класс, чтобы сделать это к югу от причислять QAbstractSpinBox.

Может быть, посмотрите на принятый ответ на этот вопрос: How to subclass QSpinBox so it could have int64 values as maxium and minimum

+0

Тогда может быть быстрее переключиться на что-то вроде QComboBox.Сначала я начал писать предлагаемый подкласс, но это выглядело как пустая трата времени. Спасибо, в любом случае ! – CTZStef

+0

Ну, вероятно, это не пустая трата времени, если вы можете использовать этот класс много. Звучит очень полезно для меня. – Pete

+0

Ну, я, вероятно, дам ему шанс на этой неделе, если найду какое-то время, чтобы сэкономить. Я отредактирую свой вопрос соответствующим образом. – CTZStef

2

QSpinBox испускают другой ValueChanged после того как я не называю его SetValue, в результате чего в бесконечном цикле (до моих QVector взорвется).

Это можно предотвратить, используя QObject :: blockSignals(). Обязательно разблокируйте сигналы после этого.

Мне все еще нужно найти способ отслеживания индекса, в зависимости от того, какая стрелка QSpinBox была нажата (вверх или вниз ... Я даже не думаю, что это возможно).

Ну, я полагаю, вы можете сохранить старое значение в переменной-члене, и когда QSpinBox излучает valueChanged(), вы можете сравнить новый к старому значению, чтобы выяснить, была ли нажата вверх или стрелка вниз.

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