QT - Conectar widgets

 
Vista:
Imágen de perfil de Rafael
Val: 10
Ha mantenido su posición en QT (en relación al último mes)
Gráfica de QT

Conectar widgets

Publicado por Rafael (1 intervención) el 19/03/2020 16:11:21
Buenos días:
Estos trabajando en una aplicación que debe tener cierto comportamiento de atracción con los widgets, tengo una paleta de componentes con items que tienen sobre ellos imágenes svg incrustadas pero tengo que conectar esos items como imanes,al desplazarlos a un scrollArea de al lado, las imágenes representan tuberías y debo simular la unión de esas tuberías como imanes, pero no sé cómo hacerlo porque las tuberías tienen bordes en la figura que son los que debo conectar a otros bordes de igual forma, pero no sé de qué manera puedo conectar estos items o bueno en sí estas imágenes y se unan, he visitado varias bibliografías pero no he dado con la respuesta, me gustaría saber si alguien me pudiera ayudar , muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rafael
Val: 10
Ha mantenido su posición en QT (en relación al último mes)
Gráfica de QT

Conectar widgets

Publicado por Rafael (2 intervenciones) el 21/03/2020 03:52:26
Si ,buenas y gracias por responder, he visto cada ejemplo del asistente y bueno los que trae incluidos qt creator, de hecho también el del puzzle lo vi, pero el problema es que para, por ejemplo el caso del puzzle, tiene un comportamiento similar pero lo que quiero es lo siguiente:
Yo tengo un panel del lado derecho donde están creados una serie de componentes, para este caso items, que tienen encima ,cada uno, una imagen svg que tiene dibujada una tubería , lo que quiero hacer es conectar esas tuberías o sea los extremos de esas tuberías, que creo que sería en si conectar los items, pero mirando la figura de la tubería que tiene encima, de modo que tenga sentido, pero la esencia, que es esa en sí, no sé de qué manera hacerlo, conectar esos items como un imán, porque según he mirado los ListView tienen una propiedad por así decirlo que es snap, pero se conecta como el caso del puzzle por cualquier lado, y no sé si exista algún modo no lo sé , como decir que el item.left se conecte al right del otro items, adjunto algunas imágenes de las tuberías para que entiendas mejor lo que explico.
Saludos

elbow45.svg
y.svg-copia
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Conectar widgets

Publicado por juanki (102 intervenciones) el 22/03/2020 10:44:58
Hola

¡ Se me antoja complicado ! Aunque como suele ocurrir, igual luego no es tanto, lo cierto es que no tengo experiencia con este tipo de casos. Ya que no se trata de unir los cuadrados por los laterales, si no por cualquier parte.

No puedo aconsejarte, mírate los ejemplos de la documentación por si alguno te da una idea, también hay varios canales de youtube que hablan sobre Qt, no sé si alguno tendrá algo parecido.

Si te manejas con el inglés hay muchas más opciones para buscar.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rafael
Val: 10
Ha mantenido su posición en QT (en relación al último mes)
Gráfica de QT

Conectar widgets

Publicado por Rafael (2 intervenciones) el 25/03/2020 07:10:18
Está bien, muchas gracias de todas formas, continuaré buscando información al respecto, ya según lo que he investigado, tengo una idea, seguiré trabajando en eso, gracias por la atención.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Conectar widgets

Publicado por Rolando José (14 intervenciones) el 23/04/2025 22:44:43
El problema radica en que son dos problemas muy diferentes; pues en el ejemplo hay un puzzle de imagenes que es mucho mas simple porque son imagenes bitmap, que estan vinculadas a botones, que coinciden al moverse los botones, pero lo que preguntas son SVG, tu lo que buscan es que coincidan las lineas dentro del boton, y quizas eso no es posible moviendo solo botones.

tendrías que hacer canvas distintos, para que las lineas dibujadas en cada canvas coincida unos con otros.

alguna vez hice un puzzle con piezas separadas en tcltk lo busco y te doy el codigo para que puedas modificarlo y pasalo a QT.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Conectar widgets

Publicado por Rolando José (14 intervenciones) el 04/04/2025 17:21:16
Bueno en tkinter se podría usando place porqué luego de pintarlos en la ventana hay forma de mover los widget pixel por pixel en x y/o y como quieras, pero en QT no tengo ni la menor idea si existe algo similar a lo que hace tkinter por defecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Conectar widgets

Publicado por Rolando José (14 intervenciones) el 05/04/2025 04:03:49
bueno no se si la mejor forma sea moviendo los widgets o su contenido, mas cuando su contenido es una imagen.

pues eso es un gasto importante de RAM aunque sean SVG, por lo general:
1 crea una lista con el orden de las piezas las numera del 0 al 15 en caso del puzzle15, que es una cuadricula 4x4 con una pieza vacia que ayuda que las otras se muevan.
2. crea una funcion que alterna el orden, para que al hacer el click en una pieza se intercambie el orden en la lista con la de la pieza vacia.
3. crea una funcion que pinta las piezas en el orden de la lista.
4. por ultimo a veces pone una funcion que reconoce la lista ordenada para saber cuando se termino el juego.

A veces es mejor mover el contenido del vehiculo y no todo el vehiculo, asi por ejemplo lo hacen los trenes o los barcos, cambian los contenedores y no mueven el barco.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Conectar widgets

Publicado por Rolando José (14 intervenciones) el 24/04/2025 07:09:17
Lo más parecido que he visto con "imanes" es un tangram, mañana busco el código.
El tangram cuando se acercan las piezas se imantan
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Conectar widgets

Publicado por Rolando José (14 intervenciones) el 30/04/2025 23:34:47
Bueno estuve pensando en diferentes formas de hacer esto y creo que esta es la mejor, con tcltk (todo depende de que el GUI que uses, permita mover los widgets a su antojo, en tk es facil porque hay tres metodos distintos para poner los widgets y una vez puestos tk permite moverlos a cualquier otra posicion con place config.

bueno en caso que QT no lo pueda hacer podrias dibujar todo en un mismo canvas y cada parte de la tuberia la guardas como un objeto distinto de modo que se pueda mover o borrar y volver a dibujar donde deseees.

es mucho mas facil por varias razones, se define una malla imaginaria de 100x100 pixeles en una ventana de 900x900 donde con place config se pueden mover varios widget canvas moviendo usando la tecnica de pintar a mano alzada que se enseña en todos los lenguajes de programacion, se podria mover los widgets, una vez se mueven los widgets, al soltar el mouse se acerquen a las cordenadas mas cercanas de la malla imaginaria de 100x100.

lo unico que queda es dibujar las tuberias dentro de cada canvas para que al mover los canvas se puedan pegar con la configuracion que quieras con el arrastre.

Aqui comparto el codigo de muestra en tcltk, esta libreria tk, deberia ser un tema del foro pues sirve de GUI no solo para python, sino tambien para LUA, R, RUBY, PERL y TCL.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
set w .c
catch {destroy $w}
toplevel $w -bg #AAA
wm geometry $w "900x900+0+0"
 
# Creo 5 canvas pequeños widgets donde se pueden dibujar las tuberias que deseas
set columnas 9
for {set i 0} {$i < 5} {incr i} {
    set x [expr {($i % $columnas) * 100}]
    set y [expr {($i / $columnas) * 100}]
    set c $w.c$i
    catch {destroy $c}
    canvas $c -bg #AAA
    place $c -x $x -y $y -width 100 -height 100
}
 
#procedimiento basico enseñado en mas de 30 lenguajes de programacion para dibujar a mano alzada:
#1. con el evento click que en tk es <1> o <B1> o <ButtonPress-1>, cuando se hace el click con el mouse, se captura la posicion en (x,y) donde va a iniciar el dibujo y en nuestro caso el movimiento del widget.
# Variables globales para el arrastre
set ::drag_widget ""
set ::drag_dx 0
set ::drag_dy 0
 
# Iniciar arrastre
bind $w <ButtonPress-1> {
    set ::drag_widget [winfo containing %X %Y]
    if {[string match "$w.c*" $::drag_widget]} {
        set wx [winfo x $::drag_widget]
        set wy [winfo y $::drag_widget]
        set ::drag_dx [expr {%X - [winfo rootx $::drag_widget]}]
        set ::drag_dy [expr {%Y - [winfo rooty $::drag_widget]}]
    } else {
        set ::drag_widget ""
    }
}
 
#Al mover el mouse se hace el arrastre o movimiento del mouse, que supone se inicia el dibujo o el movimiento del widget, entonces cada milisegundo se captura la nueva posicion en (x,y) y con respecto a la posicion inicial del click <1>, se mueve el lapiz o el widget en esa diferencia de pixeles tanto en x como en y.
# Arrastrar
bind $w <B1-Motion> {
    if {$::drag_widget ne ""} {
        set nx [expr {%X - [winfo rootx $w] - $::drag_dx}]
        set ny [expr {%Y - [winfo rooty $w] - $::drag_dy}]
        place config $::drag_widget -x $nx -y $ny
    }
}
 
#3. al soltar el boton del mouse, ButtonRelease, se para el movimiento del widgt y se hace la aproximacion a la coordenada (x,y) de la malla mas cercana haciendo el efecto de movimiento imantado.
# Soltar y alinear a la cuadrícula
bind $w <ButtonRelease-1> {
    if {$::drag_widget ne ""} {
        set nx [expr {round(([winfo x $::drag_widget])/100.0)*100}]
        set ny [expr {round(([winfo y $::drag_widget])/100.0)*100}]
        place config $::drag_widget -x $nx -y $ny
        set ::drag_widget ""
    }
}

como tu lo quieres en QT pienso que no debe ser muy diferente, y como creo que estas programando en python, podrias ver este codigo funcionando si adicionas las lineas de tkinter para que tkinter evalue el script de tcltk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import tkinter as tk
w=tk.Tk()
code='''
set w .c
catch {destroy $w}
toplevel $w -bg #AAA
wm geometry $w "900x900+0+0"
wm withdraw .
# Crear 5 canvas pequeños como widgets hijos
set columnas 9
for {set i 0} {$i < 5} {incr i} {
    set cols {#F00 #0F0 #00F #FF0 #F0F #0FF}
    set x [expr {($i % $columnas) * 100}]
    set y [expr {($i / $columnas) * 100}]
    set c $w.c$i
    catch {destroy $c}
    canvas $c -bg [lindex $cols [expr {int(rand()*6)}]]
    place $c -x [expr ($i*200)] -y [expr ($i*200)] -width 200 -height 200
}
# Variables globales para el arrastre
set ::drag_widget ""
set ::drag_dx 0
set ::drag_dy 0
# Iniciar arrastre
bind $w <ButtonPress-1> {
    set ::drag_widget [winfo containing %X %Y]
    if {[string match "$w.c*" $::drag_widget]} {
        set wx [winfo x $::drag_widget]
        set wy [winfo y $::drag_widget]
        set ::drag_dx [expr {%X - [winfo rootx $::drag_widget]}]
        set ::drag_dy [expr {%Y - [winfo rooty $::drag_widget]}]
    } else {
        set ::drag_widget ""
    }
}
# Arrastrar
bind $w <B1-Motion> {
    if {$::drag_widget ne ""} {
        set nx [expr {%X - [winfo rootx $w] - $::drag_dx}]
        set ny [expr {%Y - [winfo rooty $w] - $::drag_dy}]
        place config $::drag_widget -x $nx -y $ny
    }
}
# Soltar y alinear a la cuadrícula
bind $w <ButtonRelease-1> {
    if {$::drag_widget ne ""} {
        set nx [expr {round(([winfo x $::drag_widget])/100.0)*100}]
        set ny [expr {round(([winfo y $::drag_widget])/100.0)*100}]
        place config $::drag_widget -x $nx -y $ny
        set ::drag_widget ""
    }
}
#DEMO DIBUJO TRES TUBERIAS MUY SIMPLES EN LOS CANVAS PARA QUE SE UNAN COMO DESEEN
.c.c0 create polygon "50 0 100 100 200 100 100 100 50 200 100 100" -fill #000 -outline #000 -width 50
.c.c1 create polygon "0 100 50 100 100 150 100 200 100 150 50 100" -fill #000 -outline #000 -width 50
.c.c2 create polygon "0 100 200 100" -fill #000 -outline #000 -width 50
.c.c3 create polygon "100 0 100 200" -fill #000 -outline #000 -width 50
.c.c4 create polygon "100 0 100 200 100 100 200 100 0 100 100 100" -fill #000 -outline #000 -width 50
'''
w.eval(code)
w.mainloop()


magnet_widgets
magnet_widgets_2

Espero que me entiendas el codigo y mi forma de pensar, para resolver tu problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar