答案 0 :(得分:0)
简短回答是:没有
答案很长:
您应该继承QAbstractSpinBox
并实现这两个虚拟方法:
virtual void stepBy(int steps) override;
virtual StepEnabled stepEnabled() const override;
请注意,您需要提供自己的数据存储和数据操作!
第一个函数确定在请求任一方向的步骤时发生的情况。步数的负数(表示向两个方向走多少步)意味着向下,正向意味着向上(即点击SpinBox的箭头)。 QSpinBox
会将steps
中的值添加到其值中(例如,当减去负值时)。在这里,您还可以捕获用户选择的SpiBox字符串的哪一部分,并使用
lineEdit()->selectionStart();
lineEdit()->selectedText();
完成后,使用以下方法设置正确的文本:
lineEdit()->setText(myModifedValueText); //note that your internally stored value does not need to be QString, you just need to create it from your value in this method to set it to the internal QLineEdit so it can be displayed
当SpinBox需要知道它是否可以上升或下降时,会调用第二种方法。所以基本上你在这里检查边界(如果有的话)并返回适当的标志(QAbstractSpinBox::StepUpEnabled
或QAbstractSpinBox::StepDownEnabled
或两者)。
在您的SpinBox的构造函数中,您可以将QValidator
应用于其内部QLineEdit
,以便在用户手动输入时仅接受某些格式的值,例如:
QRegExpValidator *validator = new QRegExpValidator(this);
validator->setRegExp(...); //create a RegExp for your value, you may use any Online regexp validator/creator for this to get the right one
lineEdit()->setValidator(validator);
最后,您可以微调SpinBox,以便在值无效时显示文本,或者您可以使用QAbstractSpinBox::fixup
自行修复,并使用同名QAbstractSpinBox::validate
验证输入。
对于非常拉皮条的SpinBox,您还可以重新实现其上下文菜单和操作,首先从QLineEdit
获取标准菜单:
QMenu *menu = lineEdit()->createStandardContextMenu();
在QWidget::contextMenuEvent
中,然后根据需要添加/修改它,然后再使用menu->exec(event->globalPos())
然后delete menu;
进行展示。
但QAbstractSpinBox
为您完成了大部分的基础工作,因此您只需要实施上述两种虚拟方法就可以了。