我需要QSpinBox for unsigned int。所以我寫了簡單的課:如何刷新QAbstractSpinBox?
class UnsignedSpinBox : public QAbstractSpinBox {
private:
uint32_t value = 0;
uint32_t minimum = 0;
uint32_t maximum = 100;
private:
void stepBy(int steps) {
if (steps < 0 && (uint32_t)(-1 * steps) > value - minimum)
value = minimum;
else if (steps > 0 && maximum - value < (uint32_t)steps)
value = maximum;
else
value += steps;
lineEdit()->setText(QString::number(value));
}
StepEnabled stepEnabled() const {
if (value < maximum && value > minimum)
return QAbstractSpinBox::StepUpEnabled | QAbstractSpinBox::StepDownEnabled;
else if (value < maximum)
return QAbstractSpinBox::StepUpEnabled;
else if (value > minimum)
return QAbstractSpinBox::StepDownEnabled;
else
return QAbstractSpinBox::StepNone;
}
QValidator::State validate(QString &input, int &) const {
if (input.isEmpty())
return QValidator::Intermediate;
bool ok = false;
uint32_t validateValue = input.toUInt(&ok);
if (!ok || validateValue > maximum || validateValue < minimum)
return QValidator::Invalid;
else
return QValidator::Acceptable;
}
public:
UnsignedSpinBox(QWidget* parent = 0) : QAbstractSpinBox(parent) {
lineEdit()->setText(QString::number(value));
}
virtual ~UnsignedSpinBox() { }
};
在gerenal它工作正常,但它有一個缺點。只有鼠標移動後,纔會刷新步驟按鈕(每秒調用一次功能stepEnabled
)。因此,如果我保持向上翻頁,我的旋轉框將獲得最大值,並且這些步驟按鈕在我移動鼠標之前不會更改它們的狀態。或者,如果值爲0,則按下鍵盤上的向上或向上箭頭鍵將更改值和文本,但不會更改按鈕的狀態(向下按鈕仍處於禁用狀態)。此外,當價值==最大兩個按鈕都被禁用,雖然功能stepEnabled
返回QAbstractSpinBox :: StepDownEnabled(我已經檢查過)。我究竟做錯了什麼?我如何強制QAbstractSpinBox正確繪製這些按鈕?
P.S.我使用Debian。但我不認爲這是重要的,因爲QSpinBox工作正常
我在Windows 7 Professional上試過這個類......這些按鈕根本不會被禁用(看起來在使用Qt時Windows上沒有這個功能)。我不想使用QDoubleSpinBox,因爲雙重計算比整數慢... 在Linux和Windows上,我使用Qt 5.2.0和Qt Creator 3.0.0。但專業文件包含行'greaterThan(QT_MAJOR_VERSION,4):QT + =部件' – user2717575
你用C++ 11編譯我的代碼嗎? – user2717575
@ user2717575:在這裏,C++ 11是無關緊要的。您在Windows *上使用的*風格可能不會使*按鈕被禁用時顯而易見。儘管如此,他們仍然殘疾。 –