Qt5 C ++:自定义Spinbox接受两个值

时间:2015-09-12 13:27:33

标签: c++ qt widget

我不是真的进入qt但是我想让spinbox接受两个值 即:

enter image description here

它的工作原理如下:选择要用鼠标更改的值f.e第二个值单击箭头按钮并更改此值。

有没有可能做到这一点,而不是创建一个新的自定义小部件?

1 个答案:

答案 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::StepUpEnabledQAbstractSpinBox::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为您完成了大部分的基础工作,因此您只需要实施上述两种虚拟方法就可以了。