2015年5月1日 星期五

Qt實作emit數字signal之PushButton

之前寫的某個程式,有個0~200的slider。
因為需要經常性將slider值設回100,加了一個text為100的push button,於click後作動。

原本在MainWindow寫好接收push button clicked signal的slot,於其中呼叫slider的setValue(int)設值。

後來越看越覺得這樣多一層函式很醜,因為setValue(int)本來就是slot。
為何不直接繼承出一種有clicked(int) signal的push button?

實作如下:

class MyPushButton : public QPushButton{
  Q_OBJECT
public:
  explicit MyPushButton(QWidget* parent = 0);

signals:
  void clicked(int value);
  void clicked(double value);

protected:
  void mouseReleaseEvent(QMouseEvent* e);

};

繼承QPushButton,增加clicked(int)clicked(double)兩個signals,並override mouseReleaseEvent以於正確時機emit。


NumberButton::NumberButton(QWidget* parent)
  : QPushButton(parent)

{ }

建構式,不搞怪乖乖把parent傳到QPushButton建構式

void MyPushbutton::mouseReleaseEvent(QMouseEvent* e)
{
  if(e->button() == Qt::LeftButton && hitButton(e->pos())){
    emit clicked(text().toInt());
    emit clicked(text().toDouble());
  }

  QPushButton::mouseReleaseEvent(e);

}

放開的button為滑鼠左鍵(表示先前一定有按下),且游標仍在Button內,則發出signal。
最後將QMouseEvent傳回QPushButton::mouseReleaseEvent,做正常處理。


沒有留言:

張貼留言