CreateWindow! -3ページ目

Qtのレイアウト

一つのWindowにいくつかのアイテムを置くには
Layoutを使うらしい。
QVBoxLayoutを使ってみる。
サンプルとか見るとクラスメンバにする必要はなくて
コンストラクタの関数ローカル変数の使い捨てでいいみたい。

#include <QApplication>
#include <QLCDNumber>
#include <QSlider>
#include <QVBoxLayout>

// トップwindowのクラス
class MainWindow : public QWidget
{
public:
MainWindow(QWidget* parent = 0);
private:
QLCDNumber* lcd;
QSlider* slider;
};

// トップwindowのコンストラクタ
MainWindow::MainWindow(QWidget* parent)
: QWidget(parent)
{
lcd = new QLCDNumber(3,this);
slider = new QSlider(Qt::Horizontal,this);
connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(lcd);
layout->addWidget(slider);
setLayout(layout);
}

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
MainWindow* mainWindow = new MainWindow;
    
mainWindow->show();

    return app.exec();
}


文字の下にスライダがでてきた。
Windowのサイズ変更に文字もスライダもついてくる。


QtのSLOTに悩む

ここを見ながら勉強中。

QSliderなんてあるんだね。
使ってみた
#include <QApplication>
#include <QLCDNumber>
#include <QSlider>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLCDNumber* lcd = new QLCDNumber(3);
    QSlider* slider = new QSlider;
    QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
    lcd->show();
    slider->show();

    return app.exec();
}

こんな画面になった



ちゃんとスライダを動かすとそれに連動した数字が出る。
でも、なぜか別のWindow。
やっぱり一番トップにWidgetをおかないとひとつのWindowにならないのか。

親クラスを作ってみた。
C++はクラス宣言とインプリを分けなければならないのでちょっとめんどくさい。


#include <QApplication>

#include <QLCDNumber>

#include <QSlider>


// トップwindowのクラス

class MainWindow : public QWidget

{

public:

MainWindow(QWidget* parent = 0);

private:

QLCDNumber* lcd;

QSlider* slider;

};


// トップwindowのコンストラクタ

MainWindow::MainWindow(QWidget* parent)

: QWidget(parent)

{

lcd = new QLCDNumber(3,this);

slider = new QSlider(Qt::Horizontal,this);

connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

}


int main(int argc, char** argv)

{

    QApplication app(argc, argv);

MainWindow* mainWindow = new MainWindow;

    

mainWindow->show();


    return app.exec();

}


なんかぜんぜん違う感じになった。
スライダと文字が重なってる。Window広げても広がらないし。。。

QtのLCDぽい表示

Qt4のドキュメントを見てたらへんなのを見つけた
QLCDNumber
なんでLCDぽい表示??
早速試してみた。
#include <QApplication>
#include <QLCDNumber>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLCDNumber* lcd = new QLCDNumber(3); // 桁数
    lcd->display(345); // 表示する数値
    lcd->show();

    return app.exec();
}

ラベルはWindowの大きさを変えても文字の大きさが変わらないけど
これはWindowを大きくすると文字も大きくなるようだ。

まぁ、それっぽいといえばそれっぽい。

数字が出てくるとインクリメントしたくなる。
タイマでインクリメントしたいんだけど、QTimerとかSLOTがよくわからず。
main関数でやるのは無理があるのかな。class作らないといけないのか?

反則技なんだろうけど、lcdのポインタを外に出してスレッド立ててみた。

#include <QApplication>
#include <QLCDNumber>

QLCDNumber* lcd;
int i=33;

void* func_timer(void* arg)
{
   while(1)
   {
       lcd->display(i++);
       usleep(500000); // 500ms
   }

   return arg;
}

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    pthread_t th;

    lcd = new QLCDNumber(3);
    lcd->display(i);
    lcd->show();

    pthread_create(&th, 0, func_timer, 0);

    return app.exec();
}

一応動くようだ。。
RPiLCD035TPで表示させるとそれっぽくなった。



Qtっぽいプログラムの仕方を覚えないとな。

Qt始めました

せっかく液晶がついたのでGUIアプリを作ってみたいところ。
LinuxはAndroidと違ってGUI開発環境が揃ってない感じ。
今回はQtを使って見た。
インストールは開発環境ごと入れてしまう。
sudo apt-get install qtcreator
500Mぐらいダウンロードするようだ。

ここを参照して、まずはコマンドラインで実行してみる。
mkdir qt1
cd qt1
nano main.cpp

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLabel* label = new QLabel("<h1>Hello Qt!</h1>");
    label->show();
    return app.exec();
}
qmake -project
qmake
make


ラベルが表示された。右のウインドウ。


インストールされたのはqt4.8みたい。
最新のqt5じゃないみたい。
qt4.8のリファレンスはこちら

Winのリモートデスクトップで接続

小さい液晶をつけたら、さすがにRaspberry pi単体で開発は難しそう。
普通はクロスコンパイルしてPCで開発するんだろうけど
せっかくRaspberry pi自体がだいぶ早いのでリモートで入ってみることにした。
今はWindowsのリモートデスクトップで接続できるんだね。

sudo apt-get install xrdp

これだけ。
Win8.1に標準で入ってるリモートデスクトップを起動して
Raspberry piのIPを入力するだけ。
結構感動モノ。

でも、キーボードが日本語にならない。
raspi-configで設定したのに反映されないみたい。

ここを参照してキーボード設定をインストールする
wget http://www.mail-archive.com/xrdp-devel@lists.sourceforge.net/msg00263/km-e0010411.ini
sudo cp km-e0010411.ini /etc/xrdp/km-0411.ini
sudo cp km-e0010411.ini /etc/xrdp/km-e0010411.ini
sudo cp km-e0010411.ini /etc/xrdp/km-e0200411.ini
sudo cp km-e0010411.ini /etc/xrdp/km-e0210411.ini

普通にXも使えるし、とても便利