Qt + Ruby、2D描画の例

Qt + Ruby、2D描画の例。



前提条件



何度かhabrを読んでQtについて聞いたが、もちろんそれが何であるかは知らなかった。 そして、ある自由な日に、Habrを読んで、再びQtに出くわしました。 これがおそらく最後のストローだった。 私はそれがどんな動物で、何と一緒に食べられたのかを知ることにしました。 いつも通りウィキペディアに行きました。 Qtについてあまり知識がなかったので、私は興味を持ち、インターネットをサーフィンし始め、このトピックをますます深く掘り下げました。 次に、ハブでこの記事を読んだ後 最終的にウィキペディアを構成し、テストアプリケーションを作成して起動しました。 先に進むことに決め、最後のQtCreatorをダウンロードし、最終的に「2Dペインティングの例」に到達するまで理解し始めました。 実際、この例はC ++でしたが、ルビーで欲しかったのです。 そして、この例全体をルビーに翻訳することにしました。 そして、私はそれをやり、さらには働きました。 そのため、ここで短い作業の結果をここに投稿することにしました;多分それは誰かに役立つでしょう。



実際に実装。

Class Helper

require 'Qt4'



#

class Helper



@background;

@circleBrush;

@textFont;

@circlePen;

@textPen;



#

def initialize

gradient = Qt::LinearGradient. new (Qt::PointF. new (50, -20), Qt::PointF. new (80, 20))



@background = Qt::Brush. new (Qt::Color. new (64, 32, 64))

@circleBrush = Qt::Brush. new (gradient)

@circlePen = Qt::Pen. new (Qt::black);

@circlePen.setWidth(1);

@textPen = Qt::Pen. new (Qt::white);

@textFont = Qt:: Font . new

@textFont.setPixelSize(50);

end



# ,

def paint(painter, event , elapsed)

painter.fillRect( event .rect(), @background)

painter.translate(100, 100)



painter.save();

painter.setBrush(@circleBrush);

painter.setPen(@circlePen);

painter.rotate(elapsed * 0.030);



r = elapsed/1000.0;

n = 30;

i = 0

while i < n do

i += 1

painter.rotate(30);

radius = 0 + 120.0*((i+r)/n)

circle_radius = 1 + ((i+r)/n)*20;

painter.drawEllipse(Qt::RectF. new (radius, -circle_radius, circle_radius*2, circle_radius*2))



end

painter.restore();



painter.setPen(@textPen);

painter.setFont(@textFont);

painter.drawText(Qt::Rect. new (-50, -50, 100, 100), Qt::AlignCenter, "Qt" );

end

end



* This source code was highlighted with Source Code Highlighter .






Class Widget

require 'Qt4'



# widget

# Qt::Widget

class Widget < Qt::Widget



#



#

@helper;

#

#

@elapsed;



#

def initialize(helper)

#

super()

#

@helper = helper

@elapsed = 0;

#

setFixedSize(200, 200);

end



# animate()

slots 'animate()'



# animate()

def animate()

@elapsed = @elapsed + sender().interval() % 1000;

repaint();

end



# override paintEvent

# repaint()

def paintEvent( event )

# Qt::Painter

painter = Qt::Painter. new

#

painter.begin(self);

painter.setRenderHint(Qt::Painter::Antialiasing);

# paint Helper

@helper.paint(painter, event , @elapsed);

#

painter.end();

end

end



* This source code was highlighted with Source Code Highlighter .






Class GlWidget

require 'Qt4'



# GLWidget OpenGL

# Qt::GLWidget

class GLWidget < Qt::GLWidget



#



#

@helper;

#

#

@elapsed;



#

def initialize(helper, parent)

#

super(Qt::GLFormat. new (Qt::GL::SampleBuffers), parent)

#

@helper = helper

@elapsed = 0;

#

setFixedSize(200, 200);

setAutoFillBackground( false );

end



# animate()

slots 'animate()'



# animate()

def animate()

@elapsed = @elapsed + sender().interval() % 1000;

repaint();

end



# override paintEvent

# repaint()

def paintEvent( event );

# Qt::Painter

painter = Qt::Painter. new

#

painter.begin(self);

painter.setRenderHint(Qt::Painter::Antialiasing);

# paint Helper

@helper.paint(painter, event , @elapsed);

#

painter.end();

end

end



* This source code was highlighted with Source Code Highlighter .




クラスウィンドウ

require 'Widget'

require 'g_l_widget'

require 'Qt4'



# window widet '

# Qt::Widget



class Window < Qt::Widget

#

#



@helper



#



def initialize(helper)

#

super()

#

@helper = helper

# widget'
a

native = Widget. new (@helper);

open_g_l = GLWidget. new (@helper, self);

native_label = Qt::Label. new (tr( "Native" ));

native_label.setAlignment(Qt::AlignHCenter);

open_g_l_label = Qt::Label. new ( "OpenGL" );

open_g_l_label.setAlignment(Qt::AlignHCenter);



layout = Qt::GridLayout. new ;

layout.addWidget(native, 0, 0);

layout.addWidget(open_g_l, 0, 1);

layout.addWidget(native_label, 1, 0);

layout.addWidget(open_g_l_label, 1, 1);

setLayout(layout);



#

timer = Qt::Timer. new (self);

# timeout() animate()

#

connect(timer, SIGNAL( 'timeout()' ), native, SLOT( 'animate()' ));

connect(timer, SIGNAL( 'timeout()' ), open_g_l, SLOT( 'animate()' ));

#

timer.start(50);



setWindowTitle( "2D Painting on Native and OpenGL Widgets" );

end

end



* This source code was highlighted with Source Code Highlighter .






およびmain.rbファイル自体

require 'helper'

require 'window'

require 'Qt4'



# Qt

app = Qt::Application. new (ARGV)

# Helper

helper = Helper. new

# widget'

widget = Window. new (helper)

#

widget.show

#

app.exec



* This source code was highlighted with Source Code Highlighter .







All Articles