GUIプログラミング - QTのQSliderマウスは、問題を見つけるためにクリック

これらの日パッケージには、QTとシンプルなプレーヤーのアクションクラス、書き込みUIテストプログラムを実施する予定libvlc、我々は、マウスクリックの処理に再生の進行状況QSlider表示コントロールを発見し、マウスダウンの位置に直接配置することはできません。この問題を解決するために、私はいくつかのブログの記事にソリューションを提供するために、インターネット上で見えたが、達成された効果は理想的ではない、主な問題は、ときにマウスのクリック位置、位置ずれそこで、私は以下のソリューションを提供します。

1.フィルタコントロールはQSliderにイベントを設定します

設定(私のコードは、ウィジェットのコンストラクタで設定されているような)ときQSlider制御親ウィンドウの初期化:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ......
    ui->hSlider_duration->installEventFilter(this);
    ......
    ui->hSlider_volume->installEventFilter(this);
    ......
}

2.過負荷eventFilter()インタフェース

eventFilter()インターフェースをオーバーロード親ウィンドウQSlider制御し、その後のために左マウスボタンイベント押し決定する動作をフィルタリングします。

bool Widget::eventFilter(QObject * watched, QEvent * event)
{
    if ((event->type() == QEvent::MouseButtonPress) &&
        ((watched == ui->hSlider_duration) || (watched == ui->hSlider_volume)))
    {
        on_slider_mouseLButtonPress(watched, event);
    }

    return QWidget::eventFilter(watched, event);
}

3.計算値を見つけるためにクリック

void Widget::on_slider_mouseLButtonPress(QObject * slider, QEvent * event)
{
    do
    {
        //======================================
        // 只处理 鼠标左键 的按下事件

        QSlider     * sliderCtrl = static_cast< QSlider     * >(slider);
        QMouseEvent * mouseEvent = static_cast< QMouseEvent * >(event );
        if (Qt::LeftButton != mouseEvent->button())
        {
            break;
        }

        //======================================
        // 确定控件操作的基本参数

        int cxctl = 0;  // 滑块宽度
        int cxwnd = 0;  // 滑槽长度
        int mxpos = 0;  // 鼠标按下的位置

        if (Qt::Horizontal == sliderCtrl->orientation())
        {
            // 水平样式的 slider
            cxctl = sliderCtrl->minimumSizeHint().width();
            cxwnd = sliderCtrl->width();
            if (sliderCtrl->invertedAppearance())
                mxpos = cxwnd - mouseEvent->x();
            else
                mxpos = mouseEvent->x();
        }
        else
        {
            // 垂直样式的 slider
            cxctl = sliderCtrl->minimumSizeHint().height();
            cxwnd = sliderCtrl->height();
            if (sliderCtrl->invertedAppearance())
                mxpos = mouseEvent->y();
            else
                mxpos = cxwnd - mouseEvent->y();
        }

        if (cxwnd <= cxctl)
        {
            break;
        }

        //======================================
        // 计算结果,并设置新计算得到的 position 值

        int scpos = sliderCtrl->minimum() +
                    (int)((sliderCtrl->maximum() - sliderCtrl->minimum()) *
                          ((mxpos - cxctl / 2.0) / (cxwnd - cxctl)));

        if (sliderCtrl->sliderPosition() == scpos)
        {
            break;
        }

        sliderCtrl->setSliderPosition(scpos);

        //======================================

    } while (0);
}

4.次のようにウィジェットクラス宣言インタフェースヘッダファイルです。

class Widget : public QWidget
{
    ......

    // overrides
protected:
    virtual bool eventFilter(QObject * watched, QEvent * event);

    // inner invoking
protected:
    void on_slider_mouseLButtonPress(QObject * slider, QEvent * event);

    ......
};

さらに、別の記事でも、私のlibvlcプレーヤー完成したパッケージの種類、
libvlc -プレイヤーの典型的なプログラム[つかむためのC ++のコードRGB画像データとPCMオーディオ機能]

おすすめ

転載: www.cnblogs.com/Gaaagaa/p/12130799.html