📜 ⬆️ ⬇️

Qt + Ruby, 2D drawing example

Qt + Ruby, 2D drawing example.

Precondition

While reading Habr I heard about Qt several times, but of course I didn’t know what it was. And in one free day I read Habr, I again stumble on Qt. This was probably the last straw. I decided to find out what kind of animal it is and what it does eat. I went as usual to Wikipedia . Having learned not much about Qt, I became interested and began surfing the Internet more and more venturing into this topic. Then read this article on Habré. I finally set up Wikipedia, and also created and launched a test application. I decided to go ahead. I downloaded the last QtCreator. I began to understand it until I finally got to the example of “2D Painting Example”. The fact is that this example was in C ++ and I wanted to ruby. And then I decided to translate this whole example into ruby. And I did it and even earned it. Therefore, I decided to post the result of my not long work here can be useful to someone.

Actually implementation.
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 .
Class window
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 .

and the main.rb file itself
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/68190/


All Articles