ページ

2013年12月4日水曜日

Qwt のスライダーを使ってみる

Qtのスライダーもあるけど、
Qwt で用意してあるスライダーを使ってみる。

とりあえず、表示してみる。
#include "mainwindow.h"
#include <QApplication>

#include <qwt_plot.h>
#include <qwt_slider.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();

    QwtPlot *plot = new QwtPlot;

    // スライダー関係
    QwtSlider *slider = new QwtSlider(plot);
    slider->setOrientation(Qt::Horizontal);//横位置のスライダー


    plot->resize( 600, 400 );
    plot->show();
    return a.exec();
}

表示だけは、さすがに簡単でした。

キャンバスの中にスライダーを表示してみる。
キャンバスはプロットエリアか?
#include "mainwindow.h"
#include <QApplication>

#include <qwt_plot.h>
#include <qwt_slider.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();

    QwtPlot *plot = new QwtPlot;

    //キャンバスを取得
    QWidget *myCanbas = plot->canvas();

    // スライダー関係
    QwtSlider *slider = new QwtSlider(myCanbas);
    slider->setOrientation(Qt::Horizontal);//横位置のスライダー

    plot->resize( 600, 400 );
    plot->show();
    return a.exec();
}



スライダーをキャンバスの下に置きたいので、レイアウトを考えてみる。
#include "mainwindow.h"
#include <QApplication>

#include <qwt_plot.h>
#include <qwt_slider.h>
#include <QBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();

    QwtPlot *plot = new QwtPlot;

    //キャンバスを取得
    QWidget *myCanbas = plot->canvas();

    // スライダー関係
    QwtSlider *slider = new QwtSlider();
    slider->setOrientation(Qt::Horizontal);//横位置のスライダー

    // レイアウトを考える
    QVBoxLayout *layout = new QVBoxLayout;//レイアウトを設定 上から下
    layout->addStretch(1);//上に空白を開ける
    layout->addWidget(slider);//レイアウトにスライダーを入れる

    // キャンバスにレイアウトを設定
    myCanbas->setLayout(layout);

    plot->resize( 600, 400 );
    plot->show();
    return a.exec();
}

やっぱりキャンバスの中で無い方がいいのかな?

スライダーの位置を取得してみる。
main.h
#ifndef MAIN_H
#define MAIN_H

#include <QWidget>
#include <QApplication>

#include <qwt_plot.h>
#include <qwt_slider.h>
#include <QBoxLayout>

class MyMain : public QWidget
{
    Q_OBJECT
    
public:
    
    MyMain(QWidget *parent = 0): QWidget(parent)
    {
    }
    
public slots:
    void setValueToTheLabel(double value);
    
};

#endif // MAIN_H


main.cpp
#include "main.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();

    QwtPlot *plot = new QwtPlot;

    //キャンバスを取得
    QWidget *myCanbas = plot->canvas();

    // スライダー関係
    QwtSlider *slider = new QwtSlider();
    slider->setOrientation(Qt::Horizontal);//横位置のスライダー
    MyMain *mySlot = new MyMain;
    QObject::connect( slider, SIGNAL(valueChanged(double)), mySlot, SLOT(setValueToTheLabel(double)) );

    // レイアウトを考える
    QVBoxLayout *layout = new QVBoxLayout;//レイアウトを設定 上から下
    layout->addStretch(1);//上に空白を開ける
    layout->addWidget(slider);//レイアウトにスライダーを入れる

    // キャンバスにレイアウトを設定
    myCanbas->setLayout(layout);

    plot->resize( 600, 400 );
    plot->show();
    return a.exec();
}


void MyMain::setValueToTheLabel(double value)
{
    qDebug() << QString::number( value );
}

スライダーを移動させるとQT Creatorのアプリケーション出力に値が表示される。


QwtSlider の目盛表示

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qwt_plot.h>
#include <qwt_counter.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_marker.h>
#include <qwt_slider.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QwtPlot *plot = new QwtPlot;
ui->verticalLayout_2->addWidget(plot);
QwtPlotCurve *sinCurve = new QwtPlotCurve();
sinCurve->setTitle( "sin curve" );
sinCurve->setPen( Qt::blue, 1 ),sinCurve->setRenderHint( QwtPlotItem::RenderAntialiased, true );
QVector<double> sinX;//空のベクタ宣言
QVector<double> sinY;//空のベクタ宣言
for( int i = 0 ; i <= 1000 ; ++i ){
double x = i/(1000-1.0);
sinX.append( x );
sinY.append( sin(2*M_PI*x) );
}
sinCurve->setSamples(sinX.data(), sinY.data(), sinX.count());
sinCurve->attach( plot );
//マーカー
QwtPlotMarker *markerH = new QwtPlotMarker();
markerH->setLineStyle(QwtPlotMarker::HLine);// 横ライン
markerH->setYValue(0.0);// 線の位置
markerH->setLabelAlignment(Qt::AlignRight|Qt::AlignTop);// マーカーラベルの位置
markerH->attach(plot);
QwtPlotMarker *markerV = new QwtPlotMarker();
markerV->setLineStyle( QwtPlotMarker::VLine );// 縦ライン
markerV->setXValue( 1.0 );
markerV->attach( plot );
plot->setAxisScale( QwtPlot::xBottom, 0.0, 1.0 );//目盛
plot->setFixedHeight(250);
//以下スライダー関係
QwtSlider *slider = new QwtSlider();
connect(slider, SIGNAL(valueChanged(double)), this, SLOT(setValue(double)));
slider->setOrientation(Qt::Horizontal);//横位置のスライダー
ui->verticalLayout_2->addWidget(slider);
//slider->setScalePosition(QwtSlider::NoScale);//目盛を非表示
QwtScaleDiv div(0, 150);//スライダーの始点・終点
//スライダーの目盛
QList<double> majorTicks;
majorTicks << 0 << 75 << 150;
div.setTicks(QwtScaleDiv::MajorTick, majorTicks);
slider->setScale(div);//ok
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setValue(double value)
{
qDebug() << value;
}
view raw mainwindow.cpp hosted with ❤ by GitHub


スライダーと目盛幅

https://github.com/yamato8/QwtQwtSliderTest.git

スライダーの目盛の始点と終点の指定
slider->setScale(0,150);

スライダーの位置を取得
slider->value();

スライダーのステップ数
slider->setTotalSteps(200);

0 件のコメント:

コメントを投稿