Menú de bola flotante de Qt

diez para las ocho

Menú de bola flotante de Qt

Tabla de contenido

Enlace original: menú de bola flotante de Qt

I. Resumen

Recientemente, quiero hacer un menú flotante genial. Teniendo en cuenta la expansión y la belleza del menú, considero aprender el sistema de animación de Qt y el contenido de la máquina de estado. Abrí el tutorial de muestra de QtCreator y lo busqué. Descubrí que los programas y programas en el tutorial es  2D Painting útil  Animated Tiles . , como se muestra en la figura a continuación, estas dos demostraciones describen cómo hacer una animación de despliegue, los estudiantes interesados ​​también pueden consultar directamente a

Con estas dos demostraciones, podemos comenzar a escribir nuestros propios programas.

2. Visualización de efectos

Las siguientes dos imágenes son las representaciones de los dos menús flotantes no válidos del autor, que muestran que el código de la Figura 1 se cargó en CSDN y se puede descargar sin créditos. El código de la Figura 2 no es de código abierto por el momento, y amigos en necesidad pueden consultar más

Función básica de menú circular, el código se cargó en CSDN:  menú circular del lado de la PC no válido de Qt, menú de bola flotante, animación de expansión

Menú de bola flotante avanzado, admite apertura de menú secundario

3. Darse cuenta del código

El archivo de implementación es relativamente simple. Solo hay archivos de encabezado y archivos de implementación. Aquí publicamos principalmente los archivos de encabezado y luego explicamos las ideas de implementación. Los detalles específicos de implementación se pueden aprender descargando el código fuente.

1. Elementos del menú

PopRingItem es un elemento de expansión de menú, que puede realizar la misma función que un menú normal vinculando una QAction externa

class PopRingItem : public QLabel
{
	Q_OBJECT

public:
	PopRingItem(QWidget *parent = 0);
	~PopRingItem();

	void SetRadius(int radius);
	int GetRadius() const;

	void BindAction(QAction * action);

signals:
	void MouseEvent(bool);

protected:
	virtual void enterEvent(QEvent * event) override;
	virtual void leaveEvent(QEvent * event) override;

	virtual void paintEvent(QPaintEvent * event) override;

protected:
	int m_iRadius = 50;
	QAction * m_actAction = nullptr;
};

2. Pelota suspendida

La bola flotante es la entrada del menú, heredada del elemento del menú y tiene funciones similares a las del elemento del menú.

class QVariantAnimation;
class QPropertyAnimation;
class PopRingMenu : public PopRingItem
{
	Q_OBJECT

public:
	PopRingMenu(QWidget *parent = 0);
	~PopRingMenu();

signals:
	void DoubleClicked();

public:
	void SetActions(const QVector<QAction *> & acts);
	void SetIcons(const QVector<QString> & icons);

	void SetAnimationEnabled(bool enabled);
	bool IsAnimationEnabled() const;

	void SetSlowlyFade(bool enabled);
	bool IsSlowlyFade() const;

	void SetDistanced(int distance);
	int GetDistanced() const;

	void SetStartAngle(int angle);
	int GetStartAngle() const;

	void SetStepAngle(int angle);
	int GetStepAngle() const;

	void SetNormalMenuSize(int size);
	int GetNormalMenuSize() const;
	void SetNormalItemSize(int size);
	int GetNormalItemSize() const;

protected:
	virtual void enterEvent(QEvent * event) override;
	virtual void leaveEvent(QEvent * event) override;
	virtual void mouseDoubleClickEvent(QMouseEvent * event) override;

	virtual void timerEvent(QTimerEvent * event) override;
	virtual bool event(QEvent * event) override;

private slots:
	void OnMouseEvent(bool);

private:
	void UpdateActions(int msecond);

	void ExpandMenu();
	void CollapseMenu();

	void SlowlyFade();
	void QuicklyLighter();

	bool IsUnderMouse() const;

	void TryCollapseMenu();
	void KillHideTimer();

private:
	int m_iDistance = 70;
	int m_iStartAngle = 0;
	int m_iStepAngle = 60;

	int m_iMenuSize = 70;
	int m_iItemSize = 60;

	int m_iTimerID = -1;

	QPropertyAnimation * m_pOpacityAnimation = nullptr;
	QVariantAnimation * m_pItemAnimation = nullptr;
	QVector<PopRingItem *> m_items;
};

3. Puntos clave

Inicialice el objeto de animación, especifique la duración de la animación y los valores de inicio y fin de la animación

La función de implementación específica de la animación no es UpdateAction, y calcula la posición y el tamaño del elemento del menú en el momento actual de la animación de acuerdo con la proporción del valor actual del progreso de la animación en el valor inicial y final de la animación.

m_pItemAnimation = new QVariantAnimation(this);

m_pItemAnimation->setEasingCurve(QEasingCurve::InCubic);
m_pItemAnimation->setStartValue(ShowMenuStartValue);
m_pItemAnimation->setEndValue(ShowMenuEndValue);
m_pItemAnimation->setDuration(ShowMenuDuration);

connect(m_pItemAnimation, &QVariantAnimation::valueChanged, this, [this](const QVariant & v){
	UpdateActions(v.toInt());
});

Cuando el ratón entra en la bola flotante, realiza la animación de expansión.

void PopRingMenu::ExpandMenu()
{
	if (m_pItemAnimation)
	{
		if (m_pItemAnimation->state() != QAbstractAnimation::Running
			&& m_pItemAnimation->currentValue().toInt() != ShowMenuEndValue)
		{
			m_pItemAnimation->setDirection(QVariantAnimation::Forward);
			m_pItemAnimation->start();
		}
	}
	else
	{
		UpdateActions(ShowMenuEndValue);
	}

	KillHideTimer();
	QuicklyLighter();
}
  1. Cuando el mouse deje la bola flotante, ejecute la animación de retracción, que es opuesta a la animación de despliegue.
  2. Hay un punto de detalle al retraer la animación, es decir, cuando el mouse pasa sobre el elemento del menú, no se puede retraer
void PopRingMenu::CollapseMenu()
{
	if (false == IsUnderMouse())
	{
		if (m_pItemAnimation)
		{
			m_pItemAnimation->setDirection(QVariantAnimation::Backward);
			m_pItemAnimation->start();
		}
		else
		{
			UpdateActions(ShowMenuStartValue);
		}

		KillHideTimer();
		SlowlyFade();
	}
}

Expanda y contraiga los detalles de implementación de la animación, especifique el número de fotogramas de acuerdo con la animación, escale y mueva los elementos del menú proporcionalmente

void PopRingMenu::UpdateActions(int msecond)
{
	int curDistance = msecond * m_iDistance / ShowMenuEndValue;
	for (int i = 0; i < m_items.size(); ++i)
	{
		PopRingItem * item = m_items.at(i);
		
		double radians = qDegreesToRadians(m_iStepAngle * i * 1.0 + m_iStartAngle);
		int offx = curDistance * qCos(radians);
		int offy = curDistance * qSin(radians);
		item->move(pos() + QPoint(offx, offy));

		int curSize = msecond * m_iItemSize / ShowMenuEndValue;
		item->SetRadius(curSize);

		item->setVisible(ShowMenuStartValue != msecond);
	};

	::SetWindowPos(HWND(winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}

Cuando la bola flotante no se activa durante un tiempo específico, se desvanecerá para reducir el impacto visual en el usuario

void PopRingMenu::SetSlowlyFade(bool enabled)
{
	if (enabled)
	{
		if (nullptr == m_pOpacityAnimation)
		{
			m_pOpacityAnimation = new QPropertyAnimation(this, "opacity");
			m_pOpacityAnimation->setEasingCurve(QEasingCurve::OutCubic);
			m_pOpacityAnimation->setStartValue(SlowlyStartValue);
			m_pOpacityAnimation->setEndValue(SlowLyEndValue);
			m_pOpacityAnimation->setDuration(SlowlyFadeDuration);
		}
	}
	else
	{

		if (m_pOpacityAnimation)
		{
			delete m_pOpacityAnimation;
			m_pOpacityAnimation = nullptr;
		}
	}
}

4. Artículos relacionados

  1. Personalización de elementos del menú Qt
  2.  Menú contextual QAbstractItemView de Qt
  3. Sombra del menú emergente Qt
  4. Menú contextual QLineEdit personalizado de Qt
  5. Componente de stock de Qt - stock autoseleccionado - la lista se puede arrastrar y soltar, y el menú del botón derecho se usa comúnmente

Excelentes artículos que vale la pena ver:

  1. Finanzas Associated Press - Productos
  2. Glodon- Productos
  3. Lista de control personalizada de Qt
  4. Impresionante biblioteca Qt

Si cree que el artículo es bueno, es posible que desee dar una recompensa, escribir no es fácil, gracias por su apoyo. Su apoyo es mi mayor motivación, ¡gracias! ! !
 


Muy importante -- declaración de reimpresión

  1. Los artículos en este sitio no tienen instrucciones especiales, todos son originales y tienen derechos de autor, use el enlace cuando vuelva a imprimir y proporcione la fuente del texto original. Al mismo tiempo, escriba el autor original: mañana diez noche ocho  o  Twowords

  2. Si desea reimprimir, reimprima el texto original. Si modifica este artículo al reimprimir, informe con anticipación. Está prohibido modificar este artículo para beneficiar al reimpresor al reimprimir.


Nadie en la lucha. . .

Categorías:  casos de proyectos qt  ,  artículos qt clásicos  ,  casos de aprendizaje qt  ,  controles personalizados

Supongo que te gusta

Origin blog.csdn.net/qq_30392343/article/details/127582384
Recomendado
Clasificación