Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Nota: Pagina para descargar Qt cualquier versin ftp://ftp.qt-project.org/qt/source/ Este tutorial es Ruby Qt. En este tutorial usted aprender los fundamentos de la programacin en Qt GUI con el lenguaje Ruby. El tutorial es conveniente para los principiantes y los programadores intermedios.
Tabla de contenidos
Introduccin Diseo de gestin Artilugios Mens y barras de herramientas Dilogos Pintura Custom Widget Nibbles
Qt
Qt es un framework de aplicaciones multi-plataforma de desarrollo. Algunas de las aplicaciones conocidas desarrolladas con Qt son KDE, Opera, Google Earth y Skype. Qt fue lanzado pblicamente por primera vez en mayo de 1995. Es de doble licencia. Eso significa, que puede ser utilizado para la creacin de aplicaciones de cdigo abierto, as como las comerciales. Qt toolkit es una herramienta muy poderosa. Est bien establecido en la comunidad de cdigo abierto.
Tutoriales similares
Hay un completo tutorial de Ruby en ZetCode. Rub GTK tutorial es un tutorial para otra biblioteca de interfaz grfica de usuario con el apoyo de Ruby. Qt4 tutorial presenta la biblioteca Qt en el lenguaje C + +.
Introduccin a Ruby Qt
En esta parte del tutorial de Ruby Qt, vamos a introducir el conjunto de herramientas Qt y crear nuestros primeros programas que utilizan el lenguaje de programacin Ruby. El propsito de este tutorial es para empezar con el conjunto de herramientas Qt con el lenguaje Ruby. Las imgenes utilizadas en este tutorial puede ser descargado aqu . He utilizado algunos iconos del paquete de iconos tango del proyecto Gnome.
Sobre
Qt es una de las herramientas principales para la creacin de interfaces grficas de usuario. Ruby es un lenguaje de programacin popular.
El ejemplo crea una ventana. Si nos site el puntero del ratn sobre el rea de la ventana, una informacin sobre herramientas aparece.
require 'Qt'
El require importa palabras claves de tipos necesarios que vamos a utilizar en la aplicacin.
class QtApp<Qt::Widget
El ejemplo hereda de un Qt :: Widget . La clase Widget es la clase base de todos los objetos de interfaz de usuario. El widget es el tomo de la interfaz de usuario. Recibe los eventos del ratn, del teclado y del otro del sistema de ventanas.
setWindowTitle "Tooltip"
Figura: Tooltip
require 'Qt' WIDTH = 250 HEIGHT = 150 class QtApp < Qt::Widget def initialize super setWindowTitle "Center" resize WIDTH, HEIGHT center show end def center qdw = Qt::DesktopWidget.new screenWidth = qdw.width screenHeight = qdw.height
x = (screenWidth - WIDTH) / 2 y = (screenHeight - HEIGHT) / 2 move x, y end end app = Qt::Application.new ARGV QtApp.new app.exec
El conjunto de herramientas Qt toolkit, no tiene un mtodo simple para centrar una ventana.
WIDTH = 250 HEIGHT = 150
A continuacin se calcula la coordenadas x, y de la ventana centrada. Para centrar una ventana en la pantalla, es necesario conocer el tamao de la pantalla y el tamao de la ventana.
move x, y
require 'Qt' class QtApp < Qt::Widget def initialize super setWindowTitle "Quit button" init_ui resize 250, 150 move 300, 300 show end def init_ui quit = Qt::PushButton.new 'Quit', self quit.resize 80, 30 quit.move 50, 50 connect quit, SIGNAL('clicked()'), $qApp, SLOT('quit()') end end app = Qt::Application.new ARGV QtApp.new app.exec
La clase Qt :: PushButton muestra un botn en Ruby Qt. Es un widget rectangular y por lo general muestra una etiqueta de texto.
init_ui
Creamos el widget de botn. El primer parmetro del constructor es la etiqueta que muestra el botn. El segundo parmetro es el widget padre del botn.
quit.resize 80, 30 quit.move 50, 50
El clicked seal se emite cuando hacemos clic sobre el botn de salida. La conexin mtodo, se conecta una seal a una ranura particular de un objeto. En nuestro caso, es el quit mtodo del objeto de aplicacin. El $qApp es un puntero global a la instancia de solicitud.
Figura: Quit botn Esta seccin fue una introduccin al kit de herramientas Qt con el lenguaje Ruby.
Diseo de gestin
En esta parte del tutorial de programacin Ruby Qt, vamos a introducir los administradores de diseo. Cuando diseamos el GUI, la interfaz grfica de usuario de nuestra aplicacin, podemos decidir qu componentes vamos a utilizar y cmo vamos a organizar los componentes de la aplicacin. Para organizar nuestros componentes, utilizamos especializados objetos no visibles llamados controladores de distribucin. Hay varias opciones en Qt. Podemos utilizar el posicionamiento absoluto, una funcin de gestores de diseo o crear un administrador de diseo personalizado. Tambin podemos crear los diseos visualmente utilizando el Qt Designer.
Qt tiene algunos controladores de distribucin importantes incorporadas. El Qt:: VBoxLayout es una clase para alinear verticalmente los widgets. Qt::HBoxLayout alinea los widgets horizontalmente. El Qt::GridLayout es una clase que expone los widgets en una cuadrcula. El diseo de cuadrcula es el gestor de diseo ms flexible. Los diseos de caja pueden anidarse uno dentro de otro para crear diseos complejos.
Posicionamiento absoluto
En la mayora de los casos, los programadores deben usar controladores de distribucin. Hay algunas situaciones, en las que podemos utilizar el posicionamiento absoluto. En la posicin absoluta, el programador especifica la posicin y el tamao de cada widget en pxeles. El tamao y la posicin de un control no cambian, si cambia el tamao de una ventana. Aplicaciones de aspecto diferente en las distintas plataformas, lo que se ve bien en Linux, no puede tener un buen aspecto en Mac OS. El Cambio de fuentes en su aplicacin puede estropear el diseo. Si traduce la aplicacin en otro idioma, debe rehacer su diseo. Por todos estos problemas, utilice el posicionamiento absoluto slo cuando tenga una razn para hacerlo.
#!/usr/bin/ruby # # # # # # # # ZetCode Ruby Qt tutorial In this program, we lay out widgets using absolute positioning. author: Jan Bodnar website: www.zetcode.com last modified: September 2012
require 'Qt' class QtApp < Qt::Widget def initialize super setWindowTitle "Absolute" init_ui resize 300, 280 move 300, 300 show end def init_ui
setStyleSheet "QWidget { background-color: #414141 }" bardejov = Qt::Pixmap.new "bardejov.jpg" rotunda = Qt::Pixmap.new "rotunda.jpg" mincol = Qt::Pixmap.new "mincol.jpg" barLabel = Qt::Label.new self barLabel.setPixmap bardejov barLabel.move 20, 20 rotLabel = Qt::Label.new self rotLabel.setPixmap rotunda rotLabel.move 40, 160 minLabel = Qt::Label.new self minLabel.setPixmap mincol minLabel.move 170, 50 end end app = Qt::Application.new ARGV QtApp.new app.exec
Usamos el mtodo move para colocar la etiqueta de la ventana en x = 20, y = 20. Al cambiar el tamao de la ventana, las etiquetas conservan su tamao inicial.
Botones ejemplo
En el siguiente ejemplo, vamos a colocar dos botones en la esquina inferior derecha de la ventana.
#!/usr/bin/ruby # # # # # # # # # ZetCode Ruby Qt tutorial In this program, we use box layouts to position two buttons in the bottom right corner of the window. author: Jan Bodnar website: www.zetcode.com last modified: September 2012
require 'Qt' class QtApp < Qt::Widget def initialize super setWindowTitle "Buttons" init_ui resize 330, 170 move 300, 300
show end def init_ui vbox = Qt::VBoxLayout.new self hbox = Qt::HBoxLayout.new ok = Qt::PushButton.new "OK", self apply = Qt::PushButton.new "Apply", self hbox.addWidget ok, 1, Qt::AlignRight hbox.addWidget apply vbox.addStretch 1 vbox.addLayout hbox end end app = Qt::Application.new ARGV QtApp.new app.exec
Estos son los dos botones que se incluirn en la esquina inferior derecha de la ventana.
hbox.addWidget ok, 1, Qt::AlignRight
Ponemos el botn Aceptar en el cuadro horizontal. El segundo parmetro es el factor stretch. Se ampla el rea asignada al botn ok. Se necesita todo el espacio disponible que queda. La alineacin de la windget dentro de esta zona es controlada por el tercer parmetro. El el botn Qt::AlignRight se alinear a la derecha.
vbox.addStretch 1
Esta lnea crea un espacio vertical amplio blanco, lo que har que la caja horizontal con los botones se ubiquen en la parte inferior.
vbox.addLayout hbox
Ejemplo en Windows
#!/usr/bin/ruby # # # # # # # # ZetCode Ruby Qt tutorial In this program, use box layouts to create a Windows example author: Jan Bodnar website: www.zetcode.com last modified: September 2012
require 'Qt' class QtApp < Qt::Widget def initialize super setWindowTitle "Windows" init_ui resize 350, 300 move 300, 300 show end
def init_ui vbox = Qt::VBoxLayout.new self vbox1 = Qt::VBoxLayout.new hbox1 = Qt::HBoxLayout.new hbox2 = Qt::HBoxLayout.new windLabel = Qt::Label.new "Windows", self edit = Qt::TextEdit.new self edit.setEnabled false activate = Qt::PushButton.new "Activate", self close = Qt::PushButton.new "Close", self help = Qt::PushButton.new "Help", self ok = Qt::PushButton.new "OK", self vbox.addWidget windLabel vbox1.addWidget vbox1.addWidget hbox1.addWidget hbox1.addLayout activate close, 0, Qt::AlignTop edit vbox1
vbox.addLayout hbox1 hbox2.addWidget help hbox2.addStretch 1 hbox2.addWidget ok vbox.addLayout hbox2, 1 setLayout vbox end end app = Qt::Application.new ARGV QtApp.new app.exec
En la parte central de la ventana que tenemos un control de edicin de texto y dos botones verticalmente alineados. Los botones de entrar en una caja vertical. Los botones estn alineadas a la parte superior dentro de esta caja vertical. La caja vertical y la edicin de texto vaya en una caja horizontal. Este cuadro horizontal va a la caja vertical de la base, justo debajo del control de etiqueta.
Ayuda hbox2.addWidget hbox2.addStretch 1 hbox2.addWidget ok vbox.addLayout hbox2, 1
La ayuda y el botn Aceptar entrar en otra caja horizontal. Hay un espacio expandido blanco entre estos dos botones. Una vez ms, la caja horizontal va a la caja base vertical.
setLayout vbox
#! / Usr / bin / ruby # ZetCode Rub tutorial Qt # # En este programa, utilice el GridLayout # para crear un ejemplo en Nueva carpeta. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 09 2012 require 'Qt' clase QtApp <Qt :: Widget def initialize sper setWindowTitle "Nueva carpeta" init_ui cambio de tamao 300, 300 se mueven 300, 300 Fin de la presentacin def init_ui red = Qt :: GridLayout.new auto nameLabel = Qt :: Label.new "Nombre", self NAMEEDIT = Qt :: texto LineEdit.new self = Qt :: TextEdit.new auto okButton = Qt :: PushButton.new "OK", self closeButton = Qt :: PushButton.new "Close", self grid.addWidget nameLabel, 0, 0 grid.addWidget NAMEEDIT, 0, 1, 1, 3 grid.addWidget texto, 1, 0, 2, 4 grid.setColumnStretch 1, 1 grid.addWidget okButton, 4, 2 grid.addWidget closeButton, 4, 3 end end app = Qt :: Application.new (ARGV) QtApp.new app.exec
En nuestro ejemplo, tenemos una etiqueta, una lnea de edicin, una edicin de texto y dos botones.
cuadrcula = Qt :: GridLayout.new auto
Ponemos el control de etiqueta en la primera celda de la cuadrcula. Las clulas contar desde 0. Los dos ltimos parmetros son el nmero de fila y columna.
grid.addWidget NAMEEDIT, 0, 1, 1, 3
El widget de edicin se sita en la primera fila, segunda columna. Los dos ltimos parmetros son el tamao de fila y el tamao de columna. Horizontalmente, el widget se extender por tres columnas.
grid.setColumnStretch 1, 1
Los parmetros del mtodo son el nmero de columna y el factor de estiramiento. Aqu establecemos factor de estiramiento 1 a la segunda columna. Esto significa, que esta columna tendr todo el espacio restante. As lo establece, porque queramos que nuestros botones para conservar su tamao inicial.
Artilugios
En esta parte del tutorial de programacin Ruby Qt, cubriremos los widgets bsicos. Los widgets son los bloques bsicos de construccin de una aplicacin GUI. Con los aos, varios widgets se convirti en un estndar en todos los conjuntos de herramientas en todas las plataformas de sistemas operativos. Por ejemplo, un botn, una casilla de verificacin o una barra de desplazamiento. Qt tiene un rico conjunto de controles que cubre la mayor parte de las necesidades de programacin. Aparatos ms especializados se pueden crear como widgets personalizados.
Qt :: CheckBox
El Qt :: CheckBox es un widget, que tiene dos estados. On y Off. El estado On se visualiza mediante una marca de verificacin. Se utiliza para denotar una propiedad booleana. El Qt :: widget de casilla de verificacin ofrece una casilla con una etiqueta de texto.
#! / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa utiliza Qt :: CheckBox # widget para mostrar / ocultar el ttulo de # de la ventana. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 09 2012 require 'Qt' clase QtApp <Qt :: Widget slots 'on_toggled (bool)' def initialize sper setWindowTitle "Qt :: CheckBox" init_ui resize 250, 150 se mueven 300, 300 def espectculo final init_ui
cb = Qt :: CheckBox.new "Mostrar ttulo", self verdadero cb.setChecked cb connect, SIGNAL ("activarse y desactivarse (bool)"), yo, SLOT ("on_toggled (bool ) ") cb.move 50, 50 def final on_toggled estatal si el estado setWindowTitle" Qt :: CheckBox "else setWindowTitle" "end end end app = Qt :: Application.new ARGV QtApp.new app.exec
En nuestro ejemplo, podemos colocar una casilla de verificacin en la ventana. La casilla de verificacin muestra / oculta el ttulo de la ventana.
setWindowTitle "Qt :: CheckBox"
El Qt :: CheckBox widget est creado. El primer parmetro del constructor es su etiqueta de texto. El segundo parmetro es el widget padre.
cb.setChecked verdadero
El ttulo es visible al comienzo de la aplicacin. As que la casilla de verificacin debe ser revisado tambin.
conectar cb, SIGNAL ("activarse y desactivarse (bool)"), yo, SLOT ("on_toggled (bool)")
La activarse la seal se emite cuando el estado de una casilla de verificacin. Cuando se emite la seal, que desencadenan la on_toggled mtodo.
si el estado setWindowTitle "Qt :: CheckBox" else setWindowTitle "" end
Figura: Qt :: CheckBox
Qt :: Etiqueta
El Qt :: Etiqueta widget se utiliza para mostrar texto o imagen. Sin interaccin del usuario est disponible.
#! / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa utiliza Qt :: widget de etiqueta para mostrar # letra de una cancin. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 09 2012 requieren de clase 'Qt' QtApp <Qt :: Widget def initialize sper setWindowTitle "Sabes que no soy buena" init_ui cambio de tamao 250, 150 se mueven 300, 300 def espectculo final init_ui text = "Te veo abajo en el bar y escuch las mangas enrolladas y su crneo t-shirt Usted dice por qu lo hiciste con l hoy? oler y me fuera como si yo fuera Tanqueray \ n causa usted es mi to, mi to me la mano de Stella y volar por el tiempo que estoy fuera de la puerta se desgarra por hombres como Roger Moore \ n Me enga como saba que hara yo ya lo dije, era un problema que sabemos que No soy bueno "label = Qt :: Label.new texto, auto label.setFont Qt :: Font.new" Purisa ", 9 vbox = Qt :: VBoxLayout.new vbox.addWidget etiqueta setLayout vbox end end app = Qt :: Application.new ARGV QtApp.new app.exec
En lugar de manualmente la codificacin de la posicin y el tamao de la etiqueta, es poner la etiqueta en un diseo de caja.
Figura: Qt :: Etiqueta
Qt :: LineEdit
El Qt :: LineEdit es un widget que permite introducir y editar una sola lnea de texto sin formato. Hay deshacer / rehacer, cortar / pegar y arrastrar y soltar las funciones disponibles para un Qt :: LineEdit widget.
#! / Usr / bin / ruby # ZetCode Rub Qt tutorial # # Este programa muestra el texto # que se introduce en un widget de Qt :: LineEdit # en un widget de Qt :: Label. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 09 2012 requieren de clase 'Qt' QtApp <Qt :: 'on_changed (QString)' slots Widget def initialize sper setWindowTitle "LineEdit" init_ui cambio de tamao 250, 150 movimiento 300, 300 def espectculo final init_ui @ label = Qt :: Label.new auto edit = Qt :: LineEdit.new auto connect edicin, SIGNAL ("TextChanged (QString)"), yo, SLOT ("on_changed (QString)" ) edit.move 60, 100@label.move 60, 40 def final on_changed text@label.setText text@label.adjustSize end end app = Qt :: Application.new ARGV QtApp.new app.exec
En nuestro ejemplo se muestran dos widgets. Una lnea de edicin y un widget etiqueta. El texto introducido en la edicin en lnea se muestra el widget etiqueta.
edit = Qt :: LineEdit.new auto
Cuando escriba o borre parte del texto de la edicin de lnea, el on_changed mtodo se dispara.
def on_changed text@label.setText text@label.adjustSize final
En el on_changed mtodo, se establece el contenido de la edicin de lnea para el widget de etiqueta. El adjustSize mtodo garantiza que todo el texto es visible.
Botones de alternar
Botones de alternar son pulsadores con un pabelln conjunto comprobable. Toggle botn es un botn que tiene dos estados. Prensado y no presionado. Usted alternar entre estos dos estados haciendo clic en l. Hay situaciones en las que esta funcionalidad se adapta bien.
#! / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa utiliza botones de seleccin para cambiar el color de fondo # de # un widget. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 09 2012 require 'Qt' clase QtApp <Qt :: Widget slots 'on_clicked () def initialize sper setWindowTitle "botn Toggle" init_ui cambio de tamao 300, 180 mover 300, 300 def espectculo final init_ui @ color = Qt :: Color.new 0, 0, 0 setGeometry 300, 300, 280, 170 setWindowTitle "ToggleButton" @ RedB = Qt :: 'Red' PushButton.new, auto @ RedB . setCheckable true@redb.move 10, 10 connect @ RedB, SIGNAL ("clicked ()"), SLOT ("on_clicked ()") = @ greenb Qt :: 'Green' PushButton.new, self@greenb.setCheckable verdadero @ greenb.move 10, 60 connect @ greenb, SIGNAL ("clicked () '), SLOT (" on_clicked () ") = @ blueb Qt :: PushButton.new" Azul ", self@blueb.setCheckable verdadero blueb @. movimiento de 10, 110 connect @ blueb, SIGNAL ("clicked ()"), SLOT ("on_clicked ()") @ cuadrado = Qt :: Widget.new self@square.setGeometry 150, 20, 100, 100@square.setStyleSheet "QWidget {background-color:% s}"% @ end def color.name on_clicked rojo = @ Color.red verde = @ = @ Color.green azul Color.Blue if@redb.isChecked rojo ms rojo = 255 = 0 End if@greenb.isChecked verde ms verde = 255 = 0
final if@blueb.isChecked azul ms azul = 255 = 0 @ end color = Qt :: Color.new rojo, verde, blue@square.setStyleSheet ("QWidget {backgroundcolor:% s} "% @ color.name) end end app = Qt :: Application.new ARGV QtApp.new app.exec
En el ejemplo de cdigo, se utilizan tres botones de seleccin para cambiar el color de un control rectangular.
@ RedB = Qt :: 'Red' PushButton.new, self@redb.setCheckable verdadero
Creamos un widget cuadrado. Hemos establecido su tamao. Al principio, es negro. En Qt, se utiliza hojas de estilos para personalizar el aspecto de un widget. Dentro de la on_clicked mtodo, se determina el valor del color y actualizar el widget cuadrado a un nuevo color.
rojo = @ Color.red verde = @ = @ Color.green azul Color.Blue
La parte roja del color se cambia, dependiendo del estado del botn de conmutacin rojo.
@ Color = Qt :: Color.new rojo, verde, azul
Qt :: ComboBox
El Qt :: ComboBox es un widget que permite al usuario elegir entre una lista de opciones. Se trata de un control de seleccin que muestra el elemento actual, y puede mostrar una lista de elementos seleccionables. Un cuadro combinado puede ser editable. Se presenta una lista de opciones para el usuario de una manera que toma la cantidad mnima de espacio en la pantalla.
#! / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa utiliza el widget de Qt :: ComboBox. # La opcin seleccionada en el men desplegable que se muestra en el # widget de etiqueta. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: Sepetmber 2012 require 'Qt' clase QtApp <Qt :: ranuras widget 'on_activated (QString)' def initialize sper setWindowTitle "Qt :: ComboBox" init_ui resize 250, 150 se mueven 300, 300 def espectculo final init_ui @ label = Qt :: Label.new "Ubuntu", combo self = Qt :: ComboBox.new auto combo.addItem "Ubuntu" combo.addItem "Fedora" combo.addItem " Mandriva "combo.addItem" Red Hat "combo.addItem" Mint "combo connect, SIGNAL (" activado (QString) "), yo, SLOT (" on_activated (QString) ") combo.move 50, 50 30@label.move , 100 def final on_activated text@label.setText text@label.adjustSize end end app = Qt :: Application.new ARGV QtApp.new app.exec
En nuestro ejemplo de cdigo, tenemos dos widgets. Un cuadro combinado y un widget de etiqueta. La opcin seleccionada en un cuadro combinado se muestra en la etiqueta.
@ Label = Qt :: Label.new "Ubuntu", self
En esta parte del tutorial de Ruby Qt, hemos presentado varios widgets Qt.
Una barra de men es una de las partes ms visibles de la aplicacin GUI. Se trata de un grupo de comandos situados en varios mens. Mientras que en las aplicaciones de consola que tena que recordar todos esos arcanos comandos, aqu tenemos la mayora de los comandos agrupados en partes lgicas. Hay normas aceptadas que reducen an ms la cantidad de gasto tiempo para aprender una nueva aplicacin. Mens de grupo comandos que podemos usar en una aplicacin. Las barras de herramientas proporcionan un acceso rpido a los comandos ms utilizados.
Men sencillo
El primer ejemplo se mostrar un men simple.
#! / Usr / bin / ruby # ZetCode Rub Qt tutorial # # Este programa muestra un sencillo men #. Tiene una accin, que # finalizar el programa, cuando # seleccionado. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 11 2012 require 'Qt' clase QtApp <Qt :: MainWindow def initialize sper setWindowTitle "Men Simple" init_ui cambio de tamao 250, 150 se mueven 300, 300 Fin de la presentacin def init_ui quit = Qt :: Action.new "& Salir", el archivo self = MenuBar (). AgregarMen "& Archivo" file.addAction dejar connect (dejar de fumar, SIGNAL ("disparado ()"), Qt :: Application.instance, SLOT ("quit ()")) end end app = Qt :: Application.new ARGV QtApp.new app.exec
Tenemos una barra de mens, un men y una accin. Con el fin de trabajar con los mens, hay que heredar de MainWindow widget.
dejar de fumar = Qt :: Action.new "& Salir", auto
Esta lnea de cdigo crea una accin . Cada men tiene uno o ms objetos de accin. Tenga en cuenta el signo (&) carcter. Crea un acceso directo para el elemento. Alt + Q. Tambin subraya el carcter Q. El acceso directo est activado, cuando el men de archivo se coloca hacia abajo.
archivo = MenuBar (). AgregarMen "& Archivo" file.addAction dejar
Creamos un men de objetos. El carcter ampersand crea un acceso directo. Alt + F. Los atajos consecutivos Alt + F, Alt + Q salir de la aplicacin.
connect (dejar de fumar, SIGNAL ("disparado ()"), Qt :: Application.instance, SLOT ("quit ()"))
Submen
Un submen es un men conectado a otro objeto de men. El ejemplo siguiente lo demuestra.
! # / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa crea un submen # # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 11 2012 requieren de clase 'Qt' QtApp <Qt: :. MainWindow def initialize sper setWindowTitle "Submen" init_ui cambio de tamao 280, 200 se mueven 300, 300 def espectculo final init_ui quit = Qt :: Action.new "& Salir", el archivo self = MenuBar () AgregarMen "& Archivo" IMPM = Qt :: Menu.new "Importar" semillas = Qt :: Action.new "Importar feed de noticias ...", las marcas de auto = Qt :: Action.new "Importar marcadores ...", el correo self = Qt :: Action.new " Importar correo ... ", impm.addAction auto impm.addAction semillas marca impm.addAction correo file.addMenu IMPM file.addAction dejar connect (dejar de fumar, SIGNAL (" disparado () "), Qt :: Application.instance, SLOT ( "quit ()")) end end app = Qt :: Application.new ARGV QtApp.new app.exec
semillas = Qt :: Action.new "news feed Importar ...", las marcas de auto = Qt :: Action.new "Importar marcadores ...", el correo self = Qt :: Action.new "Importar correo ..." , auto
Figura: Submen
! # / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa muestra la imagen # mens, atajos y un separador # # autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 11 2012 require 'Qt' clase QtApp <Qt :: MainWindow def initialize sper setWindowTitle "Men Imagen" init_ui cambio de tamao 280, 200 se mueven 300, 300 def espectculo final init_ui newpix = Qt :: Icon.new "new.png" openpix = Qt :: Icon.new " open.png "quitpix = Qt :: Icon.new" exit.png "Newa = Qt :: Action.new newpix," & Nuevo ", self open = Qt :: Action.new openpix," & Abrir ", auto quit = Qt :: Action.new quitpix, "& Salir", quit.setShortcut yo "Ctrl + Q" file = MenuBar (). AgregarMen "& Archivo" file.addAction Newa file.addAction file.addAction file.addSeparator dejar abierta connect (dejar de fumar, SEAL ("activado ()"), Qt :: Application.instance, SLOT ("quit ()")) end end app = Qt :: Application.new ARGV QtApp.new app.exec
En nuestro ejemplo, tenemos un men con tres acciones. Slo la accin de dejar de hacer algo realmente, si lo selecciona. Tambin creamos un separador y un atajo Ctrl + Q, que pondr fin a la aplicacin.
newpix = Qt :: Icon.new "new.png" openpix = Qt :: Icon.new "open.png" quitpix = Qt :: Icon.new "exit.png"
Esta lnea crea un acceso directo. Haciendo clic en este acceso directo, vamos a ejecutar la accin para dejar de fumar, que se salga de la aplicacin.
file.addSeparator
Hemos crear un separador. El separador es una lnea horizontal, que nos permite acciones de men de grupo en algunas partes lgicas.
El addToolBar mtodo de la MainWindow crea una barra de herramientas para la aplicacin. La cadena de texto ofrece una barra de herramientas un nombre. Este nombre se utiliza para hacer referencia a esta barra de herramientas, porque puede haber varias barras de herramientas en una sola aplicacin. Si haga clic derecho en el rea de la ventana, podemos ver una opcin de comprobarse, que muestra / oculta la barra de herramientas.
toolbar.addSeparator
Cuando se hace clic en el objeto de accin para dejar de fumar, la aplicacin termina.
Deshacer Rehacer
El siguiente ejemplo demuestra, cmo podemos desactivar botones de barra de herramientas en la barra de herramientas. Es una prctica comn en la programacin de GUI. Por ejemplo, el botn Guardar. Si guardar todos los cambios de nuestro documento en el disco, el botn Guardar est desactivado en muchos editores de texto. De esta forma la solicitud indica al usuario, todos los cambios que estn ya registrados.
! # / Usr / bin / ruby # ZetCode Rub Qt tutorial # # Esto deshabilita programas / # permite acciones en una barra de herramientas # # Autor: Jan Bodnar # web: www.zetcode.com # ltima modificacin: 11 2012 requieren de clase 'Qt' QtApp <Qt :: 'count ()' slots MainWindow def initialize sper setWindowTitle "Toolbar" init_ui cambio de tamao 250, 150 se mueven 300, 300 def espectculo final init_ui @ count = 2 undoi = Qt :: Icon.new "undo.png" redoi = Qt :: Icon.new "redo.png" quitpi = Qt :: Icon.new "quit.png" toolbar = addToolBar "primera barra de herramientas" @ und = toolbar.addAction undoi, "Deshacer" @ red = toolbar.addAction redoi "Rehacer" connect @ und, SIGNAL ("disparado ()"), auto, SLOT ("count ()") connect @ red, SIGNAL ("disparado ()"), auto, SLOT ("count ()") toolbar.addSeparator dejar = toolbar.addAction quitpi, "Quit Application" connect para dejar de fumar, SIGNAL ("disparado ()"), Qt :: Application.instance, SLOT ("quit ()") end def accin count = remitente si "Deshacer "== action.text @ @ count = count - 1 else @ @ count = count + 1 end if @ contador <= False End 0@und.setDisabled true@red.setDisabled si @ count> = false 5@und.setDisabled @ red.setDisabled verdadero fin end end app = Qt :: Application.new ARGV QtApp.new app.exec
En nuestro ejemplo, tenemos tres Accin objetos y un separador. Despus de varios clics en los botones de deshacer o rehacer, se convierten en desactivada. Visualmente, los botones aparecen en gris.
@ Count = 2
Al hacer clic en el botn de barra de herramientas, la activa seal es emitida. Unimos esta seal a la cantidad mtodo.
action = remitente
Los dos botones de la barra llame al nmero mtodo. Tenemos que decirle entre ellos. Esta lnea determina que la accin objeto la actualidad se emite la seal.
si "Deshacer" == action.text @ @ count = count - 1 else @ @ count = count + 1 end
El botn de barra de herramientas deshacer resta 1 de la variable de recuento. La redo suma 1. Dependiendo del valor de la variable de recuento, se activar / desactivar los botones de la barra de herramientas.
En esta parte del tutorial de Ruby Qt, mencionamos los mens y barras de herramientas.
Dilogos
En esta parte del tutorial de programacin Ruby Qt, vamos a trabajar con cuadros de dilogo. Ventanas de dilogo o cuadros de dilogo son una parte indispensable de la mayora de aplicaciones grficas modernas. Un cuadro de dilogo se define como una conversacin entre dos o ms personas. En una aplicacin informtica un cuadro de dilogo es una ventana que se utiliza para "hablar" con la aplicacin. Un cuadro de dilogo se utiliza para ingresar datos, modificar datos, cambie la configuracin de la aplicacin Dilogos etc son un medio importante de comunicacin entre un usuario y un programa informtico.
Los cuadros de mensaje son cuadros de dilogo convenientes que proporcionan mensajes al usuario de la aplicacin. El mensaje se compone de texto y datos de imagen.
! # / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # # Este programa muestra los cuadros de dilogo de mensajes # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: Julio 2009 requieren class 'Qt' QtApp <Qt: : 'showDialog ()' slots Widget def initialize sper setWindowTitle "dilogos de mensajes" init_ui cambiar el tamao de 250, 150, 300 300 se mueven espectculo final def init_ui cuadrcula = Qt :: auto GridLayout.new grid.setSpacing 2 Error = Qt :: PushButton.new "Error", alerta self = Qt :: PushButton.new "Warning", pregunta self = Qt :: PushButton.new "Pregunta", la informacin self = Qt :: PushButton.new "Informacin", self about = Qt :: PushButton . nueva "Acerca de", error grid.addWidget auto, 0, 0 advertencias grid.addWidget, 0, 1 pregunta grid.addWidget, 1, 0 informacin grid.addWidget, 1, 1 sobre grid.addWidget, 2, 0 connect (error , SIGNAL ("clicked ()"), auto, SLOT ("showDialog ()")) connect (advertencia, SIGNAL ("clicked ()"), auto, SLOT ("showDialog ()")) connect (pregunta, SEAL ("clicked ()"), auto, SLOT ("showDialog ()")) connect (informacin, SIGNAL ("clicked ()"), auto, SLOT ("showDialog ()")) connect (aproximadamente, SIGNAL (" clicked () "), yo, SLOT (" showDialog () ")) end def showDialog botn = remitente en caso de" Error "== button.text Qt :: auto MessageBox.critical," Error "," Error al cargar el archivo! " elsif "Warning" == button.text Qt :: auto MessageBox.warning, "Advertencia", "Operation not permitted" elsif "Pregunta" == button.text Qt :: auto MessageBox.question, "Question", "Ests seguro de dejar de fumar?" elsif "Informacin" == button.text Qt :: auto MessageBox.information, "Informacin", "Descarga completa". elsif "Acerca de" Qt :: == button.text auto MessageBox.about, "Acerca de", "Rub ZetCode tutorial Qt." end end end app = Qt :: Application.new ARGV QtApp.new app.exec
Usamos el GridLayout gerente de crear una cuadrcula de cinco botones. Cada uno de los botones muestra un cuadro de mensaje diferente.
si "Error" == button.text Qt :: auto MessageBox.critical, "Error", "Error al cargar archivo"
En caso de que puls el botn de error, se muestra el cuadro de dilogo de error. Utilizamos mtodos estticos de la de mensajes de clase para mostrar los cuadros de mensaje.
InputDialog
El InputDialog clase proporciona un cuadro de dilogo simple conveniencia de obtener un nico valor para el usuario. El valor de entrada puede ser una cadena, un nmero o un elemento de una lista. Una etiqueta debe estar configurado para decirle al usuario lo que debe ingresar.
! # / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa muestra un cuadro de dilogo de entrada # # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: Julio 2009 requieren class 'Qt' QtApp <Qt :: 'showDialog ()' slots Widget def initialize sper setWindowTitle "Entrada de dilogo" init_ui cambio de tamao 400, 80 se mueven 300, 300 def espectculo final init_ui show = Qt :: PushButton.new "Dialog", auto connect (show, SIGNAL (" clicked () "), yo, SLOT (" showDialog () ")) show.move 20, 20 @ edit = Qt :: LineEdit.new self@edit.move 130, 22 Final def showDialog text = Qt :: InputDialog. auto getText, "Dilogo de entrada", "Escriba su nombre" si el texto! name = nil text.strip = si no name.empty? @ Name edit.setText final final final final App = Qt :: Application.new ARGV QtApp.new app.exec
En el ejemplo de cdigo, tenemos un botn y una edicin de lnea. El botn muestra un cuadro de dilogo de entrada. Tenemos un poco de texto y el texto se muestra en el widget de lnea de edicin.
text = Qt :: auto InputDialog.getText, "Dilogo de entrada", "Escriba su nombre"
El getText mtodo esttico crea el dilogo de entrada. El texto del cuadro de dilogo se almacena en la variable de texto.
si el texto! name = nil text.strip = si no name.empty? @ Name edit.setText end end
Antes de actualizar la edicin en lnea, nos aseguramos de que la variable de texto no es nulo y que no est vaco y no se compone slo de espacios.
ColorDialog
El ColorDialog clase proporciona un widget de dilogo para especificar los colores. La funcin del dilogo de color es permitir a los usuarios elegir los colores.
! # / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # En este programa, se utiliza el ColorDialog # para cambiar el color de un texto # etiqueta # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin : julio 2009 requieren clase 'Qt' QtApp <Qt :: 'showDialog ()' slots Widget def initialize sper setWindowTitle dilogo "Color" init_ui cambio de tamao 400, 300 se mueven 300, 300 def espectculo final init_ui @ label = Qt :: Label.new "ZetCode Rub Qt tutorial", self vbox = Qt :: VBoxLayout.new self@label.setAlignment Qt :: AlignCenter vbox.addWidget @ end def etiqueta mousePressEvent evento color = Qt :: ColorDialog.getColor si no color.isValid return end @ label.setStyleSheet "QWidget {color:% s}" end end% color.name app = Qt :: Application.new ARGV QtApp.new app.exec
Se muestra un poco de texto en el centro de la ventana. Al hacer clic en el rea de la ventana, se muestra un cuadro de dilogo de color. Cambiamos el color de primer plano del texto con el color seleccionado en el cuadro de dilogo.
def mousePressEvent evento ... final
Para recibir eventos de ratn de prensa para nuestra ventana, hay que reimplementar el mousePressEvent mtodo.
color = Qt :: ColorDialog.getColor
Figura: ColorDialog
FontDialog
Este ejemplo es similar al anterior. Esta vez, cambiar la fuente del texto.
font = Qt :: ok FontDialog.getFont
El booleano ok variable es true, si hace clic en el botn Aceptar del cuadro de dilogo. Volvemos a partir del mtodo, si el botn Cancelar se presion.
@ Label.setFont fuente
Figura: FontDialog
En esta parte del tutorial de Ruby Qt, trabajamos con ventanas de dilogo.
Pintura
En esta parte del tutorial de programacin Ruby Qt vamos a hacer un poco de pintura. Cuando tenemos que pintar? Hay situaciones, cuando tenemos que crear un widget desde cero. En tal caso, tenemos que hacer la pintura. O queremos crear grficos, adornos especiales, efectos o mejoras widget. El Pintor de clases es fundamental cuando hacemos algo de pintura en la biblioteca Qt. Eventos de pintura son recibidos en el paintEvent mtodo. Para hacer pintura de encargo, tenemos que reimplementar este mtodo.
Patrones
En Qt, hay varios modelos, que podemos utilizar para rellenar el interior de formas.
#!/usr/bin/ruby # # # # # # # # # ZetCode Ruby Qt tutorial This program draws nine rectangles. The interiors are filled with different built-in patterns. author: jan bodnar website: www.zetcode.com last modified: June 2009
require 'Qt' class QtApp < Qt::Widget def initialize super setWindowTitle "Patterns" resize 350, 280 move 300, 300 show end def paintEvent event painter = Qt::Painter.new self drawPatterns painter painter.end end def drawPatterns painter painter.setPen Qt::NoPen painter.setBrush Qt::HorPattern painter.drawRect 10, 15, 90, 60 painter.setBrush Qt::VerPattern painter.drawRect 130, 15, 90, 60 painter.setBrush Qt::CrossPattern painter.drawRect 250, 15, 90, 60 painter.setBrush Qt::Dense7Pattern painter.drawRect 10, 105, 90, 60
painter.setBrush Qt::Dense6Pattern painter.drawRect 130, 105, 90, 60 painter.setBrush Qt::Dense5Pattern painter.drawRect 250, 105, 90, 60 painter.setBrush Qt::BDiagPattern painter.drawRect 10, 195, 90, 60 painter.setBrush Qt::FDiagPattern painter.drawRect 130, 195, 90, 60 painter.setBrush Qt::DiagCrossPattern painter.drawRect 250, 195, 90, 60 end end app = Qt::Application.new ARGV QtApp.new app.exec
In the code example, we will draw nine rectangles and fill them with different brush patterns.
def paintEvent event painter = Qt::Painter.new self drawPatterns painter painter.end end
When the window area needs to be redrawn, the paintEvent method is called. This happens, when we resize the window, maximize it or minimize it etc. Inside this method, we create the Painter object. This object is used to do all painting in Qt. The painting itself is delegated to the drawPatterns method.
painter.setPen Qt::NoPen
The pen object is used to draw outlines of the shapes. In our example we will not use a pen.
painter.setBrush Qt::HorPattern
We draw a rectangle, with the current pen and brush. The first two parameters of the method are the x, y coordinates. The last two parameters are the width and height of the rectangle.
painter.end
Figure: Patterns
Shapes
The Qt painting API can draw various shapes. The following programming code example will show some of them.
#!/usr/bin/ruby # # # # # # # ZetCode Ruby Qt tutorial This program draws basic shapes author: jan bodnar website: www.zetcode.com last modified: June 2009
require 'Qt'
class QtApp < Qt::Widget def initialize super setWindowTitle "Basic shapes" resize 350, 280 move 300, 300 show end def paintEvent event painter = Qt::Painter.new self drawShapes painter painter.end end def drawShapes painter painter.setRenderHint Qt::Painter::Antialiasing painter.setPen Qt::Color.new 150, 150, 150 painter.setBrush Qt::Brush.new Qt::Color.new 150, 150, 150 path1 = Qt::PainterPath.new path1.moveTo 5, 5 path1.cubicTo 40, 5, 50, 50, path1.cubicTo 5, 99, 50, 50, painter.drawPath path1 99, 99 5, 5
painter.drawPie 130, 20, 90, 60, 30*16, 120*16 painter.drawChord 240, 30, 90, 60, 0, 16*180 painter.drawRoundRect 20, 120, 80, 50 points = [] points.push points.push points.push points.push points.push Qt::Point.new Qt::Point.new Qt::Point.new Qt::Point.new Qt::Point.new 130, 180, 180, 220, 140, 140 170 140 110 100
polygon = Qt::Polygon.new points painter.drawPolygon polygon painter.drawRect 250, 110, 60, 60 baseline = Qt::PointF.new 20, 250 font = Qt::Font.new "Georgia", 55 path2 = Qt::PainterPath.new
path2.addText baseline, font, "Q" painter.drawPath path2 painter.drawEllipse 140, 200, 60, 60 painter.drawEllipse 240, 200, 90, 60 end end app = Qt::Application.new ARGV QtApp.new app.exec
In this code example, we draw nine different shapes on the window. A complex path, a pie, a chord, a rounded rectangle, a polygon, a rectangle, a character based shape, a circle and an ellipse.
painter.setRenderHint Qt::Painter::Antialiasing
We use antialiasing in the example. Antialiased shapes look better, but it takes more time to draw them.
painter.setPen Qt::Color.new 150, 150, 150 painter.setBrush Qt::Brush.new Qt::Color.new 150, 150, 150
La forma compleja primero se crea con la PainterPath objeto. La clase PainterPath proporciona un recipiente para operaciones de pintura. Un camino pintor es un objeto compuesto por una serie de bloques de construccin grficos, como rectngulos, elipses, lneas y curvas.
painter.drawPie 130, 20, 90, 60, 30 * 16, 120 * 16 painter.drawChord 240, 30, 90, 60, 0, 16 * 180 painter.drawRoundRect 20, 120, 80, 50
puntos = [] points.push Qt :: Point.new 130, 140 points.push Qt :: Point.new 180, 170 points.push Qt :: Point.new 180, 140 points.push Qt :: Point.new 220 , 110 points.push Qt :: Point.new 140, 100 polgono = Qt :: puntos Polygon.new polgono painter.drawPolygon
Figura: Formas
Rectngulos transparentes
La transparencia es la cualidad de ser capaz de ver a travs de un material. La manera ms fcil de entender la transparencia es imaginar un trozo de vidrio o el agua. Tcnicamente, los rayos de luz puede pasar a travs del vidrio y de esta manera podemos ver los objetos detrs del vidrio.
En grficos de computadora, podemos lograr efectos de transparencia con la composicin alfa. Composicin alfa es el proceso de combinar una imagen con un fondo para crear la apariencia de una transparencia parcial. El proceso de composicin utiliza un canal alfa. (Wikipedia.org, answers.com)
#! / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa se basa Ten # # rectngulos con diferentes niveles de transparencia. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: Junio 2009 require 'Qt' clase QtApp <Qt :: Widget def initialize sper setWindowTitle "rectngulos transparentes" cambio de tamao 590, 90 300, 300 se mueven definicin final espectculo paintEvent evento pintor = Qt :: Painter.new auto DrawRectangles pintor painter.end final def DrawRectangles pintor painter.setPen Qt :: nAbrir for i in 1 .. 10 painter.setBrush Qt :: Brush.new Qt :: Color.new 0 , 0, 255, i * 25 * i painter.drawRect 50, 20, 40, 40 end end end app = Qt :: Application.new ARGV QtApp.new app.exec
En el ejemplo que vamos a sacar diez rectngulos con diferentes niveles de transparencia.
painter.setPen Qt::NoPen
No utilizamos pluma.
for i in 1 .. 10 painter.setBrush Qt :: Brush.new Qt :: Color.new 0, 0, 255, i * 25 painter.drawRect 50 * i, 20, 40, 40 final
Donut Shape
En el siguiente ejemplo se crea una forma compleja por rotacin de un manojo de elipses.
! # / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa dibuja un donut forma # # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: Junio 2009 require 'Qt' clase QtApp <Qt Widget :: def initialize sper setWindowTitle "Donut" resize 350, 280 se mueven 300, 300 def espectculo final paintEvent pintor event = Qt :: Painter.new auto drawDonut pintor painter.end final def drawDonut pintor painter.setRenderHint Qt :: Painter :: Color Antialiasing = Qt :: Color.new color.setNamedColor "# 333333" pen = Qt :: Pen.new colores pen.setWidth 1 painter.setPen pluma w = ancho h = altura painter.translate Qt :: Point.new w / 2, h / 2 72.times hacer painter.drawEllipse -125, -40, 250, 80 painter.rotate 5,0 end end end app = Qt :: Application.new ARGV QtApp.new app.exec
En este ejemplo, creamos un donut. La forma se asemeja a una galleta, de ah el nombre de donut.
color = Qt :: Color.new color.setNamedColor "# 333333"
Nos mover el sistema de coordenadas para el centro de la ventana. De esta manera hacemos el dibujo matemticamente ms fcil.
72.times hacer painter.drawEllipse -125, -40, 250, 80 painter.rotate final 5,0
Dibujamos un objeto elipse 72 veces. Cada vez que gire la elipse en 5 grados. Esto crear nuestra forma de rosquilla.
Figura: Donut
Dibujar texto
En el ltimo ejemplo, vamos a dibujar texto en la ventana.
! # / Usr / bin / ruby # ZetCode tutorial de Ruby Qt # # Este programa dibuja texto en la ventana # # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: Junio 2009 requieren class 'Qt' QtApp < Qt :: Widget def initialize sper setWindowTitle "Soulmate" resize 370, 240 se mueven 300, 300 def espectculo final paintEvent evento pintor = Qt :: Painter.new auto drawText pintor painter.end final def drawText pintor painter.setBrush Qt :: Brush. nuevo Qt :: Color.new 25, 25, 25 painter.setFont Qt :: Font.new "Purisa", 10 painter.drawText Qt :: Point.new (20, 30), "La mayora de las relaciones parecen tan transitorio" pintor. drawText Qt :: Point.new (20, 60): "Son buenos, pero no el permanente" painter.drawText Qt :: Point.new (20, 120), "Quin no dura para alguien a quien abrazar" painter.drawText Qt :: Point.new (20, 150): "Quin sabe amar sin ser dicho" painter.drawText Qt :: Point.new (20, 180), "Que alguien me diga por qu estoy en mi propio "painter.drawText Qt :: Point.new (20, 210):" Si hay un alma gemela para cada uno "end end app = Qt :: Application.new ARGV QtApp.new app.exec
En esta parte del tutorial de programacin Ruby Qt, hicimos un poco de pintura.
Custom Widget
En esta parte del tutorial de programacin Ruby Qt, vamos a crear un widget personalizado. Toolkits slo suelen proporcionar los widgets ms comunes como botones, widgets de texto, barras de desplazamiento, etc No toolkit puede proporcionar todos los controles posibles. Los programadores deben crear widgets tales por s mismos. Lo hacen mediante el uso de las herramientas de dibujo que proporciona el conjunto
de herramientas. Hay dos posibilidades. Un programador puede modificar o mejorar un widget existente. O puede crear un widget personalizado desde cero.
El widget Burning
En el siguiente ejemplo, vamos a crear un widget quema personalizado. Este control puede verse en aplicaciones como Nero o K3B. El widget se puede crear a partir de cero.
#!/usr/bin/ruby # ZetCode Ruby Qt tutorial # # # # # # In this program, we create a custom widget @author jan bodnar website zetcode.com last modified July 2009
require 'Qt' PANEL_HEIGHT = 30 DISTANCE = 19 LINE_WIDTH = 5 DIVISIONS = 10 FULL_CAPACITY = 700 MAX_CAPACITY = 750 class Burning < Qt::Widget def initialize(parent) super(parent) @num = [ "75", "150", "225", "300", "375", "450", "525", "600", "675" ] @redColor = Qt::Color.new 255, 175, 175 @yellowColor = Qt::Color.new 255, 255, 184 @parent = parent setMinimumHeight PANEL_HEIGHT end def paintEvent event
painter = Qt::Painter.new self drawWidget painter painter.end end def drawWidget painter w = width.to_f slid_width = @parent.getCurrentWidth step = (w / DIVISIONS).round.to_f till = ((w / MAX_CAPACITY) * slid_width).to_f full = ((w / MAX_CAPACITY) * FULL_CAPACITY).to_f if slid_width > FULL_CAPACITY painter.setPen @yellowColor painter.setBrush Qt::Brush.new @yellowColor painter.drawRect Qt::RectF.new 0, 0, full, PANEL_HEIGHT painter.setPen @redColor painter.setBrush Qt::Brush.new @redColor painter.drawRect Qt::RectF.new full+1, 0, till-full, PANEL_HEIGHT else if slid_width > 0 painter.setPen @yellowColor painter.setBrush Qt::Brush.new @yellowColor painter.drawRect Qt::RectF.new 0, 0, till, PANEL_HEIGHT end end painter.setPen Qt::Color.new 90, 90, 90 painter.setBrush Qt::NoBrush painter.drawRect 0, 0, w-1, PANEL_HEIGHT-1 newFont = font newFont.setPointSize 7 painter.setFont newFont for i in (1..@num.length) painter.drawLine Qt::LineF.new i*step, 1, i*step, LINE_WIDTH metrics = Qt::FontMetrics.new newFont w = metrics.width @num[i-1] painter.drawText(Qt::PointF.new(i*step-w/2, DISTANCE), @num[i-1]) end end end
class QtApp < Qt::Widget slots 'onChanged(int)' def initialize super setWindowTitle "The Burning Widget" initUI resize 370, 200 move 300, 300 show end def initUI @cur_width = 0 @slider = Qt::Slider.new Qt::Horizontal , self @slider.setMaximum MAX_CAPACITY @slider.setGeometry 50, 50, 130, 30 connect(@slider, SIGNAL("valueChanged(int)"), self, SLOT("onChanged(int)")) vbox = Qt::VBoxLayout.new self hbox = Qt::HBoxLayout.new vbox.addStretch 1 @widget = Burning.new self hbox.addWidget @widget, 0 vbox.addLayout hbox setLayout vbox end def onChanged val @cur_width = val @widget.repaint end def getCurrentWidth return @cur_width end end app = Qt::Application.new ARGV QtApp.new app.exec
These are important constants. The PANEL_HEIGHT defines the height for the custom widget. The DISTANCE is the distance of the numbers on the scale from the top of their parent border. The LINE_WIDTH is the vertical line width. The DIVISIONS is the number of parts of the scale. The FULL_CAPACITY is the maximum capacity of the media. After it is reached, overburning happens. This is visualized by a red color. The MAX_CAPACITY is the maximum capacity of a medium.
@num = [ "75", "150", "225", "300", "375", "450", "525", "600", "675" ]
We get the width of the widget. The width of the custom widget is dynamic. It can be resized by a user.
We use the w variable to do the transformations. Between the values of the scale and the custom widget's measures. Note that we use floating point values. We get greater precision in drawing.
painter.setPen @ redcolor painter.setBrush Qt :: Brush.new @ redcolor painter.drawRect Qt :: RectF.new completo +1, 0, hasta que llena, PANEL_HEIGHT
Estas tres lneas de dibujar el rectngulo rojo, lo que indica la grabacin de tamao extra.
painter.drawRect 0, 0, w-1, PANEL_HEIGHT-1
Aqu nos basamos en los nmeros de la escala. Para colocar con precisin los nmeros, debemos obtener el ancho de la cadena.
@ Widget = Burning.new auto hbox.addWidget @ widget, 0
Cuando el valor de la barra cambia, la almacenamos en el interior del cur_width @ variable y volver a pintar el widget personalizado.
def volver getCurrentWidth @ end cur_width
Este mtodo es llamado por el widget personalizado para obtener el valor del control deslizante actual.
En esta parte del tutorial de Ruby Qt, hemos demostrado cmo crear un widget personalizado.
Nibbles
En esta parte del tutorial de programacin Ruby Qt, vamos a crear un clon juego Nibbles. Nibbles es un juego antiguo video clsico. Fue creado por primera vez en aos 70. Ms tarde fue llevado a los PC. En este juego el jugador controla una serpiente. El objetivo es comer tantas manzanas como sea posible. Cada vez que la serpiente se come una manzana, su cuerpo crece. La serpiente se deben evitar las paredes y su propio cuerpo.
Desarrollo
El tamao de cada una de las articulaciones de una serpiente es 10px. La serpiente se controla con las teclas de cursor. Inicialmente, la serpiente tiene tres
articulaciones. El juego comienza inmediatamente. Cuando el juego termina, se muestra "Game Over" mensaje en el centro de la ventana. Board.rb
ANCHO ALTURA = 300 = 300 = 10 DOT_SIZE ALL_DOTS = ancho * altura / (* DOT_SIZE DOT_SIZE) RAND_POS DELAY = 29 = 140 $ x = [0] * ALL_DOTS $ y = [0] * ALL_DOTS clase general <Qt :: Widget def initialize (padre) super (padre) setFocusPolicy Qt :: StrongFocus initGame final def initGame @ left = false @ @ = true derecha hasta abajo = false = false @ @ @ ingame = true puntos = 3 = begin @ baln Qt :: Imagen. nuevo "dot.png" @ manzana = Qt :: Image.new "apple.png" @ cabeza = Qt :: Image.new "head.png" rescate pone "no se puede cargar imgenes" end for i in (0 .. @ puntos) $ x [i] = 50 - i * 10 $ y [i] = 50 setStyleSheet final locateApple "QWidget {background-color: # 000000}" @ timer = Qt :: BasicTimer.new @ timer.start (140, auto) end def paintEvent evento pintor = Qt :: Painter.new auto painter.begin si @ ingame drawObjects pintor pintor ms GameOver final painter.end final def drawObjects pintor painter.drawImage apple_x @, @ apple_y, @ manzana para z en (0 @ .. puntos) si z == 0 painter.drawImage $ x [z], $ y [z], @ cabeza ms painter.drawImage $ x [z], $ y [z], @ baln end end end def gameover pintor msg = "Game Over" pequeo = Qt :: Font.new "Helvetica", 12, Qt :: Fuentes :: Bold.value metr = Qt :: FontMetrics.new pequeo textWidth = metr.width msj h = altura w = ancho painter.setPen Qt Qt :: :: Color.new blanco painter.setFont pequeo painter.translate Qt :: Point.new w / 2, h / 2 painter.drawText-textWidth / 2, 0, final msj checkApple def si $ x [0] == @ apple_x y $ y [0] == @ @ apple_y puntos = @ + 1 puntos finales locateApple final del desplazamiento def z = @ puntos, mientras que z> 0 $ x [z] = $ x [(z - 1)] $ y [z] = $ y [(z - 1)] z = z - 1 end if @ dej $ x [0] - = DOT_SIZE extremo derecho si @ $ x [0] + = DOT_SIZE final si @ hasta $ y [0] - = DOT_SIZE final si @ $ y abajo [0] + = DOT_SIZE end end def checkCollision z = @ puntos, mientras que z> 0 si z> 4 y $ x [0] == $ x [z] y $ y [0] == $ y [z] @ ingame = False End z = z - 1 End If $ y [0]> ALTURA @ ingame = False End If $ y [0] <0 @ ingame = False End si $ x [0]> ANCHO @ ingame = False End If $ x [0] <0 @ ingame = False End final locateApple def r = rand RAND_POS @ apple_x = r * r = rand DOT_SIZE RAND_POS @ apple_y = r * Final DOT_SIZE def TimerEvent evento dentro del juego si @ checkCollision checkApple final del desplazamiento else@timer.stop repintar final def keyPressEvent evento clave = event.key si key == Qt :: Key_Left.value y no @ @ izquierda derecha = true up = @ @ = false abajo False End If key == Qt :: Key_Right.value y no @ @ izquierda derecha = true @ @ = false hasta abajo = False End If key == Qt :: Key_Up.value y no por @ @ hasta = @ = true derecho @ falso izquierda = False End If key == Qt :: Key_Down.value y no a @ @ @ = true abajo a la derecha = false @ left = false end end end
En primer lugar vamos a definir algunas constantes que se utilizan en nuestro juego.
Los ANCHO y ALTURA constantes de determinar el tamao de la Junta. El DOT_SIZE es el tamao de la manzana y el punto de la serpiente. El ALL_DOTS Define el nmero mximo de puntos posibles en el Consejo. El RAND_POS constante se usa para calcular una posicin aleatoria de una manzana. La DELAY constante determina la velocidad del juego.
$ X = [0] * ALL_DOTS $ y = [0] * ALL_DOTS
Estos dos conjuntos x tienda, y las coordenadas de todas las articulaciones posibles de una serpiente. El initGame mtodo inicializa variables, imgenes cargas e inicia una funcin de tiempo de espera.
si @ ingame drawObjects pintor otro extremo GameOver pintor
Dentro de la paintEvent mtodo, comprobamos el @ ingame variable. Si bien es cierto, nos basamos nuestros objetos. La manzana y las articulaciones de serpiente. De lo contrario, mostrar el mensaje "Game over" de texto.
def drawObjects pintor painter.drawImage @ apple_x, apple_y @, @ manzana para z en (0 .. @ puntos) si z == 0 painter.drawImage $ x [z], $ y [z], @ cabeza ms painter.drawImage $ x [z], $ y [z], @ end end end pelota
El drawObjects mtodo dibuja la manzana y las articulaciones de la serpiente. La articulacin de la primera de una serpiente es su cabeza, que est representado por un crculo rojo.
def checkApple si $ x [0] == @ apple_x y $ y [0] == @ @ apple_y puntos = @ dots + 1 end end locateApple
Los checkApple mtodo comprueba si la serpiente ha golpeado el objeto de manzana. Si es as, agregamos otra articulacin serpiente y llamar a la locateApple mtodo, que coloca al azar un nuevo objeto de manzana. En el movimiento mtodo que tenemos el algoritmo de clave del juego. Para entenderlo, observar cmo la serpiente se mueve. Usted controla la cabeza de la serpiente. Usted puede cambiar su direccin con las teclas de cursor. El resto de las
articulaciones se mueven una posicin hacia arriba de la cadena. Las segundas jugadas conjuntas en las que la primera es la articulacin tercero en la segunda, etc
mientras que z> 0 $ x [z] = $ x final de 1 - [(z - 1)] $ y [z] = $ y [(z - 1)] z = z
Mueva la cabeza hacia la izquierda. En el checkCollision mtodo, se determina si la serpiente ha afectado a s mismo o una de las paredes.
mientras que z> 0 si z> 4 y $ x [0] == $ x [z] y $ y [0] == $ y [z] @ ingame = False End z = z - 1 final
Termina el juego, si la serpiente llega a la parte inferior de la Junta. El locateApple mtodo localiza una manzana al azar en el tablero.
r = rand RAND_POS
Cada ms 140, el TimerEvent mtodo se llama. Si estamos en el juego, que llamamos tres mtodos, que se basan la lgica del juego. De lo contrario, detener el temporizador. En el keyPressEvent mtodo de la clase Board, podemos determinar las teclas que fueron presionadas.
si key == Qt :: Key_Left.value y no @ @ izquierda derecha = true @ @ = false hasta abajo = False End
Si se pulsa la tecla de cursor hacia la izquierda, nos propusimos @ izquierdo en true. Esta variable se usa en el movimiento mtodo para cambiar las coordenadas del objeto de serpiente. Ntese tambin, que cuando la serpiente se dirige a la derecha, no podemos girar inmediatamente a la izquierda. Nibbles.rb
#! / Usr / bin / ruby # ZetCode Rub tutorial Qt # # En este programa, se crea un clon # juego Nibbles. # # Autor: Jan sitio web Bodnar #: # www.zetcode.com ltima modificacin: 09 2012 require 'Qt' require 'Junta' clase QtApp <Qt :: MainWindow def initialize sper setWindowTitle "Nibbles" setCentralWidget Board.new (self) resize 310, 310 se mueven 300, 300 final App Show final = Qt :: Application.new ARGV QtApp.new app.exec
Figura: Nibbles
Este fue el juego de ordenador Nibbles programado con la biblioteca Qt y el lenguaje de programacin Ruby.