QtでのDIBクラスの実現

なかなかQtに馴染めない状態が続いいるのですが、ようやく DIBクラスの雛形ができてきました

DIBクラスとは Device-Independant Bitmapクラスのことであり、これを作らないことには DICOM XA viewerは作成できないのです

今まで作成してきたものは、所詮 Windows環境で作動するものであり、OSXのような Unixや Linuxでは作動しませんでした これをマルチプラットフォームの Qt Frameworkにより C++を用いて実現しようとしているのです

まずは DIB Class部分を これは以前 Windowsで作成したように headerにコードも記述し、これによりinline展開するようにすると共に、ライブラリのリンクという形式でなく、コードそのものを埋め込むようにしたいと思います

#ifndef CDIB_H
#define CDIB_H

#include <QtWidgets>
#include <QtGui>
#include <QImage>

// DIB Class
// cdib.h
//

class CDib : public QWidget
{
    Q_OBJECT
public:
    explicit CDib(QWidget *parent = 0) {
        resize(400, 400);
        image = new QImage(width(), height(), QImage::Format_ARGB32);
    }

    ~CDib() {
        delete image;
    }

    void update() {
        x++; y++;
        for (int i=1; i<400; i++){
            for (int j=1; j<400; j++){
                image->setPixel(i, j, qRgb(55, j%255, j%255));
            }
        }
    }

    QImage *image;

private:
    int x, y;

};

#endif // CDIB_H

これを呼ぶ時にはどうすれば良いかと言えば main windowを作成してその中でこの DIB classを実体化するのです たとえば次のようにです

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtWidgets>
#include <QtGui>
#include "cdib.h"

// mainwindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void paintEvent(QPaintEvent *event);
private:
    CDib *dib;


};

#endif // MAINWINDOW_H

そして cpp fileは以下のようにたとえばなります

#include "mainwindow.h"
#include <stdlib.h>

// mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(800, 800);
    dib = new CDib(this);
    QTimer *timer = new QTimer();
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(500);


}

MainWindow::~MainWindow()
{
    delete dib;

}

void MainWindow::paintEvent(QPaintEvent *event){

    QPainter pen(this);

    int pos_x = random()%800;
    int pos_y = random()%800;
    dib->update();
    pen.drawImage(pos_x, pos_y, *dib->image);

}

これで 500 mSec毎に場所がかわる graduationの四角形が書かれます
要するに、画面表示部分と、画面に論理的に書き込む部分が分離できたということです 即ち DICOM XA fileを読み込んで暗号解読してから、ビットマップ・イメージをこの DIB classに書き込めば後は自動的に動画となる、ということなのです 我ながら素晴らしいアイディアだと思いますよ

投稿者: (KAMAKURA & SAPPORO)Dr_Radialist

Expert Interventional Cardiologist and Amateur Computer Programmer

「QtでのDIBクラスの実現」への3件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です