日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Qt之使用GraphicsView框架實現(xiàn)思維導圖的示例_C 語言

作者:前行中的小豬 ? 更新時間: 2022-07-06 編程語言

一、簡述

我們常見的思維導圖類型XMind軟件,功能十分強大,提供了各式各樣的導圖樣式、形式,那我們可以用Qt實現(xiàn)思維導圖的功能嗎,答案肯定是可以的,用圖說明。

1、靜態(tài)方式

讀取本地數(shù)據(jù)的方式進行展示。

在這里插入圖片描述

2、優(yōu)化

(1)增加選中效果
(2)優(yōu)化連接線條

在這里插入圖片描述

3、動態(tài)方式

(1)可自由添加/刪除節(jié)點
(2)雙擊可重命名節(jié)點
(3)可折疊節(jié)點
(4)每層節(jié)點顏色可自定義
(5)支持xml格式數(shù)據(jù)的保存/讀取(可拓展為其他格式或數(shù)據(jù)庫)

在這里插入圖片描述

在這里插入圖片描述

線條繪制Code

void LineTest::paintEvent(QPaintEvent *event)
{
	QPoint startPoint = m_startPoint;
	QPoint endPoint = m_endPoint;
	int hSpace = 15;
	int radius = 8;

	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing, true);
	painter.setPen(QPen(Qt::gray, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
	// 判斷是上弧線還是下弧線;
	if (endPoint.y() < startPoint.y())
	{
		// 繪制橫線;
		painter.drawLine(startPoint, startPoint + QPoint(hSpace, 0));

		// 繪制豎線;
		startPoint += QPoint(hSpace, 0);
		QPoint vTopPoint = QPoint(startPoint.x(), endPoint.y() + radius);
		painter.drawLine(startPoint, vTopPoint);

		// 繪制上弧線;
		startPoint = vTopPoint;
		QPoint hTopPoint = QPoint(startPoint.x() + radius, endPoint.y());

		QPainterPath path(startPoint);
		// 繪制貝塞爾三次曲線;
		QPointF c1 = QPointF(startPoint.x(), hTopPoint.y());
		QPointF c2 = QPointF(startPoint.x() + 2, hTopPoint.y() + 2);
		path.cubicTo(c2, c2, hTopPoint);
		painter.drawPath(path);
		
		// 繪制橫線;
		startPoint = hTopPoint;
		painter.drawLine(startPoint, endPoint);
	}
	else if (endPoint.y() > startPoint.y())
	{
		// 繪制橫線;
		painter.drawLine(startPoint, startPoint + QPoint(hSpace, 0));

		// 繪制豎線;
		startPoint += QPoint(hSpace, 0);
		QPoint vBottomPoint = QPoint(startPoint.x(), endPoint.y() - radius);
		painter.drawLine(startPoint, vBottomPoint);

		// 繪制下弧線;
		startPoint = vBottomPoint;
		QPoint hBottomPoint = QPoint(startPoint.x() + radius, endPoint.y());

		QPainterPath path(startPoint);
		// 繪制貝塞爾三次曲線;
		QPointF c1 = QPointF(startPoint.x() + 2, hBottomPoint.y() - 2);
		QPointF c2 = QPointF(startPoint.x() + 2, hBottomPoint.y() + 2);
		path.cubicTo(c1, c1, hBottomPoint);
		painter.drawPath(path);

		// 繪制橫線;
		startPoint = hBottomPoint;
		painter.drawLine(startPoint, endPoint);
	}
	else
	{
		// 繪制直線;
		painter.drawLine(startPoint, endPoint);
	}
}

目前只實現(xiàn)了初步導圖的基礎功能,后續(xù)會增加更多的樣式選擇及拓展。

原文鏈接:https://blog.csdn.net/GoForwardToStep/article/details/124692790

欄目分類
最近更新