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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
pocket
記事: 49
登録日時: 9年前

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

#1

投稿記事 by pocket » 9年前

お世話になっております.

今回も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です.
よろしくお願いします.

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#2

投稿記事 by ISLe » 9年前

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

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


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

pocket
記事: 49
登録日時: 9年前

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

#3

投稿記事 by pocket » 9年前

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が使えないということが分かりました.

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

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#4

投稿記事 by ISLe » 9年前

ラベルを継承とは
かなりレベルアップしてきましたね。

閉鎖

“C言語何でも質問掲示板” へ戻る