2012-04-19 184 views
0

假設我有一個QSpinBox,其值爲123.45。如果我手動編輯它並開始擦除這五個值,則爲值123.4激發valueChanged。如果我繼續刪除這四個,則會再次發生。QSpinBox ValueChanged被多次觸發

而且如果我在完成編輯後按Enter鍵,它也會被觸發。

我想問題是我應該使用void QAbstractSpinBox :: editingFinished()而不是valueChanged,但它看起來像valueChanged是推薦的方法,因爲在我的oppinion中有更多的示例ans用法,所以我想確保對這個。

有什麼想法?

+0

關於'editingFinished'和'valueChanged'與禁用'keyboardTracking'之間區別的另外一件事情。 只有當焦點丟失時纔會發出'editingFinished'。用戶可以將焦點設置爲'QSpinBox'並開始滾動。如果您在滾動期間需要更新某些內容,請使用'valueChanged'。在大多數情況下,這是最好的方法。 – Vladislav 2017-07-26 10:13:10

回答

0

最後我在Qt文檔中找到了keyboardTracking property。易於設置,並且像魅力一樣工作!

+3

請在答案中加入一些最低限度的信息,這樣人們才能理解,而不必遵循鏈接。 – HWende 2013-01-30 16:28:22

+3

該鏈接現在被破壞。嘗試http://doc-snapshot.qt-project.org/4.8/qabstractspinbox.html#keyboardTracking-prop。總而言之,從頁面開始:如果禁用鍵盤跟蹤,則在鍵入時spinbox不會發出valueChanged()信號。它稍後發出信號,當按下返回鍵時,當鍵盤焦點丟失時,或者當使用其它旋轉盒功能時,按箭頭鍵。 – 2013-02-27 11:17:58

+1

額外的皺紋可能會使某人感到困惑。即使使用編輯已完成信號,在MS Visual Studio中調試其處理程序時,它可能會觸發兩次。一旦按下了返回鍵,並且如果你設置了一個調試中斷,那麼處理程序將因焦點更改而再次被調用。 – LRaiz 2014-11-27 16:15:42

0

我認爲使用任何一種信號都是好的,幾個Qt表單元素同時具有editingFinished????Changed信號。

  • QLineEdit的
  • QAbstractSpinBox亞類:
    • QDateTimeEdit
    • QDoubleSpinBox
    • QSpinBox

的多線只QTextEdit具有textChanged作爲按壓返回創建一條新線不移動焦點。

0

您可能想要實現一個密鑰處理程序,以僅在例如 (例如,回車鍵被按下。這當然是不一樣快的valueChanged() 但它可能是更有效的...

可能看起來像這樣

void MyWidget::keyPressEvent(QKeyEvent *event) 
{ 
    int key = event->key(); 

    switch (key) { 
     case Qt::Key_Return: 
     case Qt::Key_Enter: { 
      this->start(); 
      break; 
     } 
     case Qt::Key_Escape: { 
      this->close(); 
      break; 
     } 
     default: 
      QWidget::keyPressEvent(event); 
    } 
} 

你會實現這不是在自己的MySpinBox類, 但在父類。回車鍵從QSpinBox傳遞到它的父項,因爲它沒有被處理。如果該鍵未由MyWidget處理,則在函數結尾處執行此操作。然後它傳遞給基類。