1

QDoubleSpinBox を再実装しました。を介しmouseDoubleClickEventてユーザーが変更できるようにキャッチしたいと思います。singleStepQInputDialog::getDouble()

私の問題は、再実装する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);
    }
}
4

2 に答える 2

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への参照を取得し、それにイベント フィルターを割り当てました。イベントフィルターでは、マウスのダブルクリックのみをキャッチします。

于 2012-07-13T20:48:36.823 に答える