2012-07-13 78 views
1

我有一個重新實現的QDoubleSpinBox。我想趕上mouseDoubleClickEvent,使用戶可以通過QInputDialog::getDouble()更改singleStep捕捉QSpinBox文本字段mouseEvents

我的問題是,當我重新實現mouseDoubleClickEvent時,我只捕獲箭頭按鈕上發生的雙擊。實際上,我希望忽略箭頭中出現的雙擊,並只捕獲文本字段中出現的雙擊。我有一種感覺,我需要重新實現QDoubleSpinBox的一個孩子的mouseDoubleClickEvent,但我不知道如何重新實現一個孩子事件,也不知道如何選擇正確的孩子看看我的嘗試限制到一個孩子QRect代碼:I認爲我需要指定哪個孩子......?

謝謝。

編輯:更正的類聲明/定義名稱不匹配。

MyQDoubleSpinBox.h

class MyQDoubleSpinBox : public QDoubleSpinBox 
{ 
    Q_OBJECT 

public: 
    MyQDoubleSpinBox(QString str, QWidget *parent = 0); 
    ~MyQDoubleSpinBox(); 

public slots: 
    void setStepSize(double step); 

private: 
    double stepSize; 
    QString name; 

protected: 
    void mouseDoubleClickEvent(QMouseEvent *e); 
}; 

MyQDoubleSpinBox.cpp

#include "MyQDoubleSpinBox.h" 

MyQDoubleSpinBox::MyQDoubleSpinBox(QString str, QWidget *parent) 
    : QDoubleSpinBox(parent), stepSize(1.00), name(str) 
{ 
    this->setMinimumWidth(150); 
    this->setSingleStep(stepSize); 
    this->setMinimum(0.0); 
    this->setMaximum(100.0); 
} 

MyQDoubleSpinBox::~MyQDoubleSpinBox() 
{ 

} 

void MyQDoubleSpinBox::setStepSize(double step) 
{ 
    this->setSingleStep(step); 
} 

void MyQDoubleSpinBox::mouseDoubleClickEvent(QMouseEvent *e) 
{ 
    if(this->childrenRect().contains(e->pos())) 
    { 
     bool ok; 
     double d = QInputDialog::getDouble(this, 
      name, 
      tr("Step Size:"), 
      this->singleStep(), 
      0.0, 
      1000.0, 
      2, 
      &ok); 

     if(ok) 
      this->setSingleStep(d); 
    } 
} 

回答

1

黑客得到裁判的孩子了一點,但它的工作原理=)

MyQDoubleSpinBox.h:

class MyQDoubleSpinBox : public QDoubleSpinBox 
{ 
    Q_OBJECT 

public: 
    MyQDoubleSpinBox(QString str, QWidget *parent = 0); 
    ~MyQDoubleSpinBox(); 

public slots: 
    void setStepSize(double step); 

private: 
    double stepSize; 
    QString name; 

protected: 
    bool eventFilter(QObject *, QEvent *e); 
}; 

MyQDoubleSpinBox.cpp

MyQDoubleSpinBox::MyQDoubleSpinBox(QString str, QWidget *parent) 
    : QDoubleSpinBox(parent), stepSize(1.00), name(str) 
{ 
    this->setMinimumWidth(150); 
    this->setSingleStep(stepSize); 
    this->setMinimum(0.0); 
    this->setMaximum(100.0); 
    QLineEdit *editor = this->findChild<QLineEdit *>("qt_spinbox_lineedit"); 
    editor->installEventFilter(this); 
} 

MyQDoubleSpinBox::~MyQDoubleSpinBox() 
{ 

} 

void MyQDoubleSpinBox::setStepSize(double step) 
{ 
    this->setSingleStep(step); 
} 

bool MyQDoubleSpinBox::eventFilter(QObject *, QEvent *e) 
{ 
    if (e->type() == QMouseEvent::MouseButtonDblClick) 
    {  bool ok; 
     double d = QInputDialog::getDouble(this, 
              name, 
              tr("Step Size:"), 
              this->singleStep(), 
              0.0, 
              1000.0, 
              2, 
              &ok); 

     if(ok) 
      this->setSingleStep(d); 
    } 
    return false; 
} 

而是覆蓋的事件,我得到了裁判QLineEdit的底層和分配的事件濾鏡。在事件過濾器捕獲只有鼠標雙擊。

+0

甜美,像魅力一樣工作。謝謝。 – GregD 2012-07-16 14:25:26