ページ

2013年12月6日金曜日

GTK+ インストールメモ

gtk+-bundle_3.6.4-20130921_win32.zip をダウンロードして解凍
解凍して出来たフォルダの名前をを、gtk に変更。

D:\MinGW\msys\1.0\home\yamato\hellogtk\gtk に移動

hellogtk.c
#include <gtk/gtk.h>

static void destroy(GtkWidget *widget, gpointer data)
{
    gtk_main_quit();
}

int main(int argc, char **argv)
{
    GtkWidget *window;
    GtkWidget *label;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    label = gtk_label_new("Hello, world!");
    gtk_container_add(GTK_CONTAINER(window), label);
    gtk_widget_show(label);
    gtk_widget_show(window);

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
    gtk_main();

    return 0;
}

Makefile
CC=gcc
PKG_CONFIG = ./gtk/bin/pkg-config

CFLAGS = -Wall -DGTK_DISABLE_DEPRECATED `$(PKG_CONFIG) --cflags gtk+-3.0`
LDFLAGS = `$(PKG_CONFIG) --libs gtk+-3.0`

hellogtk.exe: hellogtk.o
 $(CC) -o hellogtk.exe hellogtk.o $(LDFLAGS) 

hellogtk.o: hellogtk.c
 $(CC) $(CFLAGS) -c -o hellogtk.o hellogtk.c

コマンドプロンプトから実行


出来上がったexeファイルをダブルクリックで起動させる為に必要なdllファイル
libatk-1.0-0.dll
libcairo-2.dll
libcairo-gobject-2.dll
libffi-6.dll
libfontconfig-1.dll
libfreetype-6.dll
libgdk-3-0.dll
libgdk_pixbuf-2.0-0.dll
libgio-2.0-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
libgobject-2.0-0.dll
libgtk-3-0.dll
libiconv-2.dll
libintl-8.dll
liblzma-5.dll
libpango-1.0-0.dll
libpangocairo-1.0-0.dll
libpangoft2-1.0-0.dll
libpangowin32-1.0-0.dll
libpixman-1-0.dll
libpng15-15.dll
libxml2-2.dll
pthreadGC2.dll
zlib1.dll

2013年12月5日木曜日

QwtPlot::setPlotLayout(..)

とりあえず使い方

#include "main.h"

#include <qwt_plot_curve.h>
#include <qwt_symbol.h>
#include <qwt_plot_layout.h>
#include <qwt_plot.h>

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

    QwtPlot *plot = new QwtPlot;
    plot->setTitle("Title");                //グラフのタイトル
    plot->setFooter("Footer");
    plot->setCanvasBackground(QBrush(Qt::white));//キャンバスの背景 青

    plot->setAxisTitle(0,"[kw]");       // y軸のタイトル
    plot->setAxisTitle(2,"Time [Sec]");

    plot->setAxisScale( QwtPlot::yLeft, 0.0, 10.0 );
    plot->setAxisScale( QwtPlot::xBottom, 0.0, 5.0 );

    QwtPlotCurve *curve = new QwtPlotCurve();
    curve->setTitle( "Some Points" );
    curve->setPen( Qt::blue, 4 ),
            curve->setRenderHint( QwtPlotItem::RenderAntialiased, true );

    QwtSymbol *symbol = new QwtSymbol( QwtSymbol::Ellipse,
        QBrush( Qt::yellow ), QPen( Qt::red, 2 ), QSize( 8, 8 ) );
    curve->setSymbol( symbol );

    QPolygonF points;
    points << QPointF( 0.0, 4.4 ) << QPointF( 1.0, 3.0 )
           << QPointF( 2.0, 4.5 ) << QPointF( 3.0, 6.8 )
           << QPointF( 4.0, 7.9 ) << QPointF( 5.0, 7.1 );
    curve->setSamples( points );
    curve->attach( plot );

    QwtPlotLayout *qwtLayout = plot->plotLayout();
    qwtLayout->setCanvasMargin(100,QwtPlot::yLeft);

    //plot->setPlotLayout(qwtLayout);

    //plot->replot();

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


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



Qwtのインストール・メモ Ubuntu 版

Ubuntu 13.04 
64bit qwt-6.1.0.tar.bz2 をダウンロードして解凍

Qt をインストールしたディレクトリのbinフォルダのqmakeを使う

>qmake qwt.pro -o Makefile
>make -f Makefile
>sudo make install とりあえず、/usr/local/qwt-6.1.0 ができた。

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 の目盛表示



スライダーと目盛幅

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

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

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

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

2013年12月2日月曜日

ドックウィジェット



#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <qtextedit.h>
#include <QDockWidget>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QMainWindow *window = new QMainWindow();
    window->setCentralWidget(new QTextEdit());//テキストエリア
    setCentralWidget(window);//ウインドウをセンターに設定

    QDockWidget *dwTop = new QDockWidget();//ドップダックウインドウに表示するドック生成
    QPushButton *buttonTop = new QPushButton("トップドックウインドウ");//ボタンを生成
    dwTop->setWidget(buttonTop);//ダックにボタン設定
    addDockWidget(Qt::TopDockWidgetArea, dwTop);//トップドックウインドウにドックを設定

    QDockWidget *dwButtom = new QDockWidget();
    QPushButton *buttonButtom = new QPushButton("ボトムドックウインドウ");
    dwButtom->setWidget(buttonButtom);
    addDockWidget(Qt::BottomDockWidgetArea, dwButtom);

    QDockWidget *dockMain = new QDockWidget();
    addDockWidget(Qt::LeftDockWidgetArea, dockMain);//左のドックを設定
    addDockWidget(Qt::RightDockWidgetArea, new QDockWidget());//右のドックを設定
    dockMain->setWidget(new QLabel("レフトダックエリア", dockMain));//左のドックにラベルを表示
}

MainWindow::~MainWindow()
{
    delete ui;
}


Qtのメニュー



#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(new QAction(tr("&New"), this));

    QMenu *edit = menuBar()->addMenu(tr("&Edit"));
}

MainWindow::~MainWindow()
{
    delete ui;
}


デザイン画面では、メニューバーのタイトル部分は日本語の入力が出来るが
項目の部分では日本語入ちょくが使えないので、コピー・ペーストで貼り付けるか、
ソースコードから追加する。




レイアウトを設定



#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QPushButton>
#include <QBoxLayout>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QWidget *myQWidget = new QWidget();
    setCentralWidget(myQWidget);//myQWidgetをメインウィンドウのセントラルウィジットに設定
    
    QPushButton *button1 = new QPushButton("ボタン1");//ボタンを生成
    QPushButton *button2 = new QPushButton("ボタン2");//ボタンを生成
    
    QVBoxLayout *layout = new QVBoxLayout;//レイアウトを設定 上から下
    
    layout->addWidget(button1);//レイアウトにボタンを設定
    layout->addWidget(button2);
    
    myQWidget->setLayout(layout);//ウインドウにレイアウトを設定
}

MainWindow::~MainWindow()
{
    delete ui;
}



#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QWidget *myQWidget = new QWidget();
    setCentralWidget(myQWidget);//myQWidgetをメインウィンドウのセントラルウィジットに設定

    QPushButton *button1 = new QPushButton("1");//ボタンを生成
    QPushButton *button2 = new QPushButton("2");//ボタンを生成
    QPushButton *button3 = new QPushButton("3");//ボタンを生成
    QPushButton *button4 = new QPushButton("4");//ボタンを生成
    QPushButton *button5 = new QPushButton("5");//ボタンを生成

    QHBoxLayout *hLayout = new QHBoxLayout;//レイアウトを設定 左から右
    hLayout->addWidget(button1);//レイアウトにボタンを設定
    hLayout->addWidget(button2);//レイアウトにボタンを設定
    hLayout->addWidget(button3);//レイアウトにボタンを設定

    QVBoxLayout* vLayout = new QVBoxLayout;//レイアウトを設定 上から下
    vLayout->addWidget(button4);//レイアウトにボタンを設定
    vLayout->addWidget(button5);//レイアウトにボタンを設定

    QVBoxLayout* topLayout = new QVBoxLayout;
    topLayout->addLayout(hLayout);
    topLayout->addLayout(vLayout);

    myQWidget->setLayout(topLayout);//ウインドウにレイアウトを設定
}

MainWindow::~MainWindow()
{
    delete ui;
}


参考サイト:http://qt-project.org/doc/qt-5.0/qtwidgets/mainwindow.html