Red de conocimiento informático - Material del sitio web - Cómo usar Qt para implementar componentes para uso QML

Cómo usar Qt para implementar componentes para uso QML

Utilice Qt para implementar una interfaz de usuario: un icono circular se puede arrastrar dentro o sobre el círculo, pero no se puede arrastrar fuera del círculo. Al arrastrar sobre un círculo, resalte el icono y el círculo. Similar a RingLock.

1. Heredar la clase QQuickPaintedItem, que es una subclase de QQuickItem. QQuickItem se usa para componentes utilizados por QML que no necesitan mostrar la interfaz de usuario; QQuickPaintedItem se usa para componentes utilizados por QML que necesitan mostrar la interfaz de usuario. En este caso, se requiere dibujo, por lo que se hereda QQuickPaintedItem.

/*imagedragwidget.h*/

#ifndef IMAGEDRAGWIDGET_H

#define IMAGEDRAGWIDGET_H

#include QQuickPaintedItemgt; >

#include lt;QtCoregt;

#include lt;QtGuigt;

clase imageDragWidget: QQuickPaintedItem público

{

Q_OBJECT

público:

imagen explícitaDragWidget(QQuickPaintedItem *parent = 0);

~imageDragWidget();

señales: p>

//Ratón presionado

void dragPress();

//El mouse se mueve dentro del círculo

void dragMoveIn();

p>

//El ratón se mueve sobre el círculo

void dragMoveOn();

//El ratón se suelta

void dragRelease();

//Ratón fuera del círculo, confirma apagado

void dragOut();

espacios públicos:

protegido:

pintura nula(QPainter * pintor);

void mouseMoveEvent(QMouseEvent *evento);

void mousePressEvent(QMouseEvent *evento);

void mouseReleaseEvent(QMouseEvent * event);

private:

//Juzga la relación posicional entre el mouse y el círculo: fuera del círculo, dentro del círculo , dentro del círculo

int círculoContain(void);

//Juzga la relación posicional entre el mouse y el ícono: fuera del ícono, sobre el ícono, dentro del ícono

p>

int powerContain(void);

//Obtener la relación entre el mouse y el ícono La intersección entre la línea central del círculo y el círculo

QPoint GetPoint(QPoint currentPoint, QPoint círculoCenter, int radiuis);

privado:

QPixmap *circle_defaultImg;

QPixmap *circle_boldImg;

QPixmap *power_haloImg ;

QPixmap *power_solidImg;

QPixmap *power_defaultImg;

// Imagen del círculo actual

QPixmap *circleImg;

//El rectángulo donde se encuentra la imagen del círculo

QRect *circleImgRect;

//Imagen del icono actual

QPixmap *powerImg;

//El rectángulo donde se encuentra la imagen del icono

QRect *powerImgRect;

//

Ubicación actual del mouse

QPoint currentMousePoint;

//Ubicación del icono

QPoint powerCenterPoint;

//Si el mouse está presionado Bandera

bool pressFlag;

//Marcar si el mouse se mueve hacia afuera

bool isOut;

//Relación de escala de ancho

doble anchoEscala;

//Escalado de altura

doble alturaEscala;

};

#endif // IMAGEDRAGWIDGET_H

/*imagedragwidget.cpp*/

#include "imagedragwidget.h"

#include lt;

imageDragWidget: : imageDragWidget(QQuickPaintedItem *parent) :

QQuickPaintedItem(parent)

{

//Obtener el tamaño de la pantalla

QScreen *screen = QGuiApplication::primaryScreen();

int screen_width = screen-gt; size().width();

int screen_height = screen-gt().height() ;

qDebug()lt;lt;"Tamaño de pantalla: "lt;lt;screen_widthlt;lt;"*"lt;lt;screen_height;

//El tamaño de la la imagen donde está ubicado el círculo es: 452*452 El tamaño de la imagen donde está ubicado el ícono es: 350*350

//El tamaño del ícono deslizante es 128*128

double widgetScale = (double)580/(double)720 ;

qDebug()lt;lt;"Proporción de escala del control: "lt;lt;widgetScale;

//Establecer el tamaño del control

setContentsSize(QSize (screen_width*widgetScale, screen_width*widgetScale));

int widget_width =contentSize().width();

int widget_height = contenidosSize().height();

qDebug()lt;lt;"Tamaño de control: "lt;lt;widthlt;lt;"*"lt;lt;widget_height;

//Recibir el botón izquierdo del ratón

setAcceptedMouseButtons(Qt::LeftButton);

circle_defaultImg = new QPixmap(":/images/circle_default.png" );

circle_boldImg = nuevo QPixmap(":/images /circle_bold.png");

power_haloImg

= nuevo QPixmap(":/images/power_halo.png");

power_solidImg = nuevo QPixmap(":/images/power_solid.png");

power_defaultImg = nuevo QPixmap ( ":/images/power_default.png");

isOut = false;

circleImg = Circle_defaultImg;

int Circle_width = CircleImg-gt; ;

int círculo_height = círculoImg-gt; altura();

//Establecer el tamaño de la imagen del círculo en la pantalla real

//Icono deslizante Tamaño 128*128

int círculo_width_in_widget = widget_width - 128*widgetScale;

int círculo_height_in_widget = widget_height - 128*widgetScale;

qDebug()lt;lt; "Tamaño del círculo deslizante: "lt;lt;circle_width_in_widgetlt;lt;"*"lt;lt;circle_height_in_widget;

widthScale = (double)circle_width_in_widget/(double)circle_width;

heightScale = (double)circle_height_in_widget/(double)circle_height;

qDebug()lt;lt;"La escala de ancho del círculo y del icono es: "lt;lt;widthScalelt;lt;"La escala de altura es: " lt;lt;heightScale;

circleImgRect = new QRect(0, 0, círculo_width*widthScale, círculo_height*heightScale);

//Mover la imagen del círculo al centro del control

circleImgRect-gt; moveCenter(QPoint(widget_width/2, widget_height/2));

powerImg = power_defaultImg;

int power_width = powerImg-gt; ancho();

int power_height = powerImg-gt; altura();

powerImgRect = nuevo QRect(0, 0, power_width*widthScale, power_height*heightScale

//Mueve la imagen del icono al centro del control

powerImgRect-gt; moveCenter(circleImgRect-gt; center());

powerCenterPoint = CircleImgRect-gt ; centro();

}

imagen vacía

geDragWidget::paint(QPainter *painter)

{

pintor-gt; drawPixmap(*circleImgRect, *circleImg);

pintor-gt; *powerImgRect, *powerImg);

}

void imageDragWidget: :mouseMoveEvent(QMouseEvent *evento)

{

if(pressFlag ) {

//Se presiona el mouse

int power_width = powerImgRect-gt; width();

int power_height = powerImgRect-gt; ;

int círculo_width = círculoImgRect-gt; ancho();

int círculo_height = círculoImgRect-gt; altura();

currentMousePoint = evento-gt; pos();

int flag = circuleContain();

if(flag lt; 0) {

//El icono se mueve cuando el ratón está dentro el círculo a la posición del mouse

powerImg = power_haloImg;

circleImg = Circle_defaultImg;

powerImgRect-gt; moveCenter(currentMousePoint);

powerCenterPoint = currentMousePoint;

isOut = false;

} else if(flag == 0) {

//Si el mouse está en el círculo, el el icono se mueve a la posición del mouse, cambia la imagen al mismo tiempo

powerImg = power_solidImg;

circleImg = Circle_boldImg

powerImgRect-gt; );

powerCenterPoint = currentMousePoint;

isOut = true;

} else {

//El mouse está fuera del círculo

isOut = true;

} else {

//El ratón está fuera del círculo

isOut = true;

} p>

if(powerContain() gt; 0) {

// Si el mouse está fuera del círculo y fuera del ícono, equivale a soltar el mouse. El icono regresa al centro de control.

powerImg = power_defaultImg;

powerImgRect-gt; moveCenter(circleImgRect-gt; center());

pressFlag = false

circleImg = circulo_defaultImg;

} else {

//El mouse está fuera del círculo y no fuera del ícono, luego el ícono se mueve a la intersección de la línea que conecta el mouse con el centro del control y el círculo.

powerImg = power_solidImg;

circleImg = círculo_boldImg;

powerCenterPoint = GetPoint(currentMousePoint,

circleImgRect-gt; center(), círculoImgRect-gt;ancho()/2);

powerImgRect-gt;moveCenter(powerCenterPoint);

}

}

powerImgRect-gt; setHeight(power_height);

powerImgRect-gt; setWidth(power_width);

circleImgRect-gt; gt; setWidth(circle_width);

update();

if(pressFlagamp; amp; (!isOut)) {

//Se presiona el mouse y Dentro del círculo

emitir dragMoveIn();

} else if(pressFlag&isOut){

//Se presiona el mouse y sobre el círculo

emitir dragMoveOn();

} else if((!pressFlag)amp;amp;(isOut)){

//El mouse está fuera del círculo y en Fuera del icono, equivale a soltar el ratón.

emit dragRelease();

}

if(isOutamp; amp; (!pressFlag)) {

//El ratón está fuera del círculo y fuera del icono, confirme el apagado.

emitir dragOut();

}

}

}

void imageDragWidget::mousePressEvent(QMouseEvent *evento)

{

currentMousePoint = event-gt; pos();

if(powerContain() lt; = 0) {

//Cuando el mouse ingresa al ícono, significa presionar

pressFlag = true;

int power_width = powerImgRect-gt();

int power_height = powerImgRect-gt; altura();

powerImg = power_haloImg;

powerImgRect-gt; setWidth(power_width);

actualizar();

emitir dragPress();

}

}