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 .


Source: https://habr.com/ru/post/J68190/


All Articles