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> 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();
}
}