簡體   English   中英

Qt5 C ++:自定義Spinbox接受兩個值

[英]Qt5 C++: Custom Spinbox accepting two values

我不是很喜歡qt,但是我想讓Spinbox接受兩個值,即:

在此處輸入圖片說明

它應該像這樣工作:選擇要用鼠標更改的值,然后單擊箭頭按鈕並更改此值。

是否有可能這樣做,而不創建新的自定義窗口小部件?

簡短的答案是:否

長答案是:

您應該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::fixup validate的輸入進行QAbstractSpinBox::validate

為了真正啟動SpinBox,您還可以重新實現其上下文菜單和操作,您首先從QLineEdit獲得標准菜單:

QMenu *menu = lineEdit()->createStandardContextMenu();

QWidget::contextMenuEvent並根據需要添加/修改它,然后使用menu->exec(event->globalPos())顯示它,然后delete menu;

但是QAbstractSpinBox為您完成了大部分基礎工作,因此僅實現上述兩個虛擬方法就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM