ページ 11

QTを使用して,リアルタイムに数字を表示したい

Posted: 2016年2月25日(木) 17:37
by pocket
お世話になっております.

今回もQtについて質問させていただきます.
Qt歴は半年ほどです.

Qtを使用してダイアログボックスを作成し,数字をリアルタイムに変更して表示したいです.

画像

上記の図において,数字が0からリアルタイムに大きくなるようにしたいです.

コード:

#include "mainwindow.h"
#include <QApplication>
#include<iostream>
#include <QThread>
#include <QString>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLabel *label=new QLabel("hello world!!");
    label->setFixedWidth(200);
    label->setFixedHeight(50);

    label->show();

    for(int i=0; i<100000; i++){
        QString num=QString::number(i);
        label->setText(num);
        label->show();
        //QThread::sleep(1);
    }

    return a.exec();
}
上記のようなソースコードを作成しました.
この実行結果が上の図になります.
このソースコードを実行すると,99999のみが表示されます.
また,スリープを入れると,途中は表示されず,最後の99999のみが表示されます.

ここでは,QLabelを用いていますが,特にこだわりがあるわけではありません.
リアルタイムに数字の変化の表示ができればどのような方法でもかまいません.

何かアドバイスや解決策等があれば,ぜひ教えていただきたいです.

開発環境はLubuntu のqtcreatorです.
Qtのバージョンは5です.
よろしくお願いします.

Re: QTを使用して,リアルタイムに数字を表示したい

Posted: 2016年2月27日(土) 18:07
by ISLe
pocket さんが書きました:何かアドバイスや解決策等があれば,ぜひ教えていただきたいです.
このような目的には
タイマーを用いてタイマーイベントのコールバックでコンポーネントを更新するのが王道かと思います。
#リアルタイムとは

Qtでタイマーを使う方法については
検索すればサンプルコードがすぐに見付かると思います。


最後にセットした数値しか表示されないのは
23行目でQtがGUIとして動き始めるからで
GUIというのはラベルに文字列をセットしたらすぐに表示されるというものではないです。

Re: QTを使用して,リアルタイムに数字を表示したい

Posted: 2016年3月02日(水) 16:01
by pocket
ISLeさん

回答ありがとうございます.
また,返信が送れて申し訳ありません.

アドバイスを参考にサイトや書籍で勉強しましたところ解決しました.

以下にソースコードを載せます.

MyClass.h

コード:

#ifndef MYLABEL_H
#define MYLABEL_H
#include<QLabel>
#include <QString>
#include <QPainter>
#include <QPaintEvent>

class MyClass : public QLabel
{
    Q_OBJECT

public:
    explicit MyClass(){}
    ~MyClass(){}

    int num=0;

public slots:

    void onTimer(){
        update();
    }

protected:
    //void paintEvent(QPaintEvent *event);
    void paintEvent(QPaintEvent *event){
        QPainter painter(this);
        painter.setPen(Qt::blue);
        painter.setFont(QFont("Arial",20));
        num++;
        painter.drawText(rect(), Qt::AlignCenter,QString::number(num));
    }
};

#endif // MYLABEL_H

main.cpp

コード:

#include "mainwindow.h"
#include <QApplication>
#include<iostream>
#include <QThread>
#include <QString>
#include "MyClass.h"
#include <QObject>
#include <QTimer>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTimer *timer=new QTimer();

    MyClass * myClass = new MyClass();
    myClass->setFixedWidth(200);
    myClass->setFixedHeight(50);
    myClass->show();

    QObject::connect(timer,SIGNAL(timeout()), myClass, SLOT(onTimer()));
    timer->start(20);

    return a.exec();
}

上記のプログラムでリアルタイムに数字の変更ができました.
イベント駆動型であるQtでは単純に無限ループやsleppが使えないということが分かりました.

皆さんありがとうございました.

Re: QTを使用して,リアルタイムに数字を表示したい

Posted: 2016年3月02日(水) 18:16
by ISLe
ラベルを継承とは
かなりレベルアップしてきましたね。