C++圖形界面開(kāi)發(fā)Qt教程:嵌套圓環(huán)示例
Qt是一個(gè)跨平臺(tái)框架,通常用作圖形工具包,它不僅創(chuàng)建CLI應(yīng)用程序中非常有用。而且它也可以在三種主要的臺(tái)式機(jī)操作系統(tǒng)以及移動(dòng)操作系統(tǒng)(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式設(shè)備,Android(Necessitas)和iOS的端口上運(yùn)行?,F(xiàn)在我們?yōu)槟闾峁┝嗣赓M(fèi)的試用版。
Qt組件推薦:
- QtitanRibbon| 下載試用: 遵循Microsoft Ribbon UI Paradigm for Qt技術(shù)的Ribbon UI組件,致力于為Windows、Linux和Mac OS X提供功能完整的Ribbon組件。
- QtitanChart | 下載試用 :是一個(gè)C ++庫(kù),代表一組控件,這些控件使您可以快速地為應(yīng)用程序提供漂亮而豐富的圖表。并且支持所有主要的桌面
嵌套圓環(huán)圖
此示例顯示如何使用QPieSeries API創(chuàng)建嵌套的圓環(huán)圖。

運(yùn)行示例
要從Qt Creator運(yùn)行示例,請(qǐng)打開(kāi)歡迎模式并從示例中選擇示例。有關(guān)更多信息,請(qǐng)?jiān)L問(wèn)構(gòu)建和運(yùn)行示例。
創(chuàng)建嵌套圓環(huán)圖
讓我們首先創(chuàng)建一個(gè)QChartView實(shí)例并在其上啟用抗鋸齒。甲QChart對(duì)象然后從所獲得的QChartView實(shí)例。圖例被禁用,圖表的標(biāo)題被設(shè)置。最后一行啟用圖表的動(dòng)畫(huà)。
QChartView *chartView = new QChartView;
chartView->setRenderHint(QPainter::Antialiasing);
QChart *chart = chartView->chart();
chart->legend()->setVisible(false);
chart->setTitle("Nested donuts demo");
chart->setAnimationOptions(QChart::AllAnimations);
定義了三個(gè)變量,用于定義圓環(huán)圖。最小和最大尺寸定義了整個(gè)甜甜圈的相對(duì)尺寸。minSize 是最小甜甜圈的相對(duì)內(nèi)部尺寸。maxSize 是最大甜甜圈的相對(duì)外部尺寸。
qreal minSize = 0.1; qreal maxSize = 0.9; int donutCount = 5;
以下代碼塊定義了各個(gè)甜甜圈及其切片。首先創(chuàng)建一個(gè)新的QPieSeries對(duì)象。每個(gè)甜甜圈中的切片數(shù)量是隨機(jī)的。內(nèi)部 for 循環(huán)使用隨機(jī)值創(chuàng)建切片,標(biāo)簽與值相同。接下來(lái),切片的標(biāo)簽設(shè)置為可見(jiàn),其顏色設(shè)置為白色。為了使示例更有趣,切片的懸停信號(hào)連接到小部件的插槽,稍后解釋其內(nèi)部工作原理。最后將切片添加到甜甜圈中。調(diào)整甜甜圈的大小以實(shí)現(xiàn)甜甜圈的嵌套。然后甜甜圈被添加到小部件的甜甜圈列表和圖表中。
for (int i = 0; i < donutCount; i++) {
QPieSeries *donut = new QPieSeries;
int sliceCount = 3 + QRandomGenerator::global()->bounded(3);
for (int j = 0; j < sliceCount; j++) {
qreal value = 100 + QRandomGenerator::global()->bounded(100);
QPieSlice *slice = new QPieSlice(QString("%1").arg(value), value);
slice->setLabelVisible(true);
slice->setLabelColor(Qt::white);
slice->setLabelPosition(QPieSlice::LabelInsideTangential);
connect(slice, &QPieSlice::hovered, this, &Widget::explodeSlice);
donut->append(slice);
donut->setHoleSize(minSize + i * (maxSize - minSize) / donutCount);
donut->setPieSize(minSize + (i + 1) * (maxSize - minSize) / donutCount);
}
m_donuts.append(donut);
chartView->chart()->addSeries(donut);
}
最后,小部件被放置在應(yīng)用程序使用的布局中。
QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(chartView, 1, 1); setLayout(mainLayout);
為了使示例更有趣,甜甜圈每 1.25 秒隨機(jī)旋轉(zhuǎn)一次。
updateTimer = new QTimer(this); connect(updateTimer(updateTimer, &QTimer::timeout, this, &Widget::updateRotation);); updateTimer->start((1250);
小部件的 updatedRotation 槽定義如下。它遍歷所有甜甜圈并通過(guò)隨機(jī)值修改它們當(dāng)前的旋轉(zhuǎn)。
void WidgetWidget::updateRotation()()
{{
for ((int i = 0; i i < m_donuts.count(); i(); i++) {
{
QPieSeries *donut = m_donuts.at(i);
(i);
qreal phaseShift = -50 + QRandomGenerator::global()()->bounded((100);
donut->setPieStartAngle(donut(donut->pieStartAngle() () + phaseShift););
donut->setPieEndAngle(donut(donut->pieEndAngle() () + phaseShift););
}}
}}
前面提到的explodeSlice 插槽代碼在下面提供。如果切片設(shè)置為爆炸,則停止控制甜甜圈旋轉(zhuǎn)的計(jì)時(shí)器。然后從切片中獲得切片的開(kāi)始和結(jié)束角度。為了突出顯示選定的切片,所有其他甜甜圈從包含選定切片的那個(gè)切片向外放置,它們的開(kāi)始和結(jié)束角度都被修改,這樣它們就不會(huì)“阻擋”突出顯示切片的道路。如果不再選擇切片,則返回原始狀態(tài)。
void WidgetWidget::explodeSlice(bool exploded)(bool exploded)
{{
QPieSlice *slice = qobject_cast<QPieSlice *>(sender());
sender());
if (exploded) {(exploded) {
updateTimer->stop();
();
qreal sliceStartAngle = slice->startAngle();
();
qreal sliceEndAngle = slice->startAngle() () + slice->angleSpan();();
QPieSeries *donut = slice->series();
();
qreal seriesIndex = m_donuts.indexOf(donut);
(donut);
for ((int i = seriesIndex + 1; i i < m_donuts.count(); i(); i++) { {
m_donuts.at(i)(i)->setPieStartAngle(sliceEndAngle);(sliceEndAngle);
m_donuts.at(i)(i)->setPieEndAngle((360 + sliceStartAngle););
}}
} } else {
{
for ((int i = 0; i i < m_donuts.count(); i(); i++) { {
m_donuts.at(i)(i)->setPieStartAngle((0);
m_donuts.at(i)(i)->setPieEndAngle((360);
}}
updateTimer->start();();
}}
slice->setExploded(exploded);(exploded);
}}
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++?拷貝構(gòu)造函數(shù)與賦值的區(qū)別
拷貝構(gòu)造函數(shù)和賦值函數(shù)非常容易混淆,本文主要介紹了C++?拷貝構(gòu)造函數(shù)與賦值的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
C++實(shí)現(xiàn)文件逐行讀取與字符匹配的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何溧陽(yáng)C++實(shí)現(xiàn)文件逐行讀取與字符匹配的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-03-03
C語(yǔ)言實(shí)現(xiàn)父進(jìn)程主動(dòng)終止子進(jìn)程的方法總結(jié)
一般的情況,子進(jìn)程自己運(yùn)行完后,執(zhí)行exit 或者return 后,父進(jìn)程wait. waitpid收回子進(jìn)程,但子進(jìn)程是一個(gè)循環(huán)等待狀態(tài)不主動(dòng)退出,父進(jìn)程可以采用文中介紹的幾種方法,需要的朋友可以參考下2023-10-10
C++ 詳解數(shù)據(jù)結(jié)構(gòu)中的搜索二叉樹(shù)
搜索二叉樹(shù)是一種具有良好排序和查找性能的二叉樹(shù)數(shù)據(jù)結(jié)構(gòu),包括多種操作,本篇只介紹插入,排序(遍歷),和刪除操作,重點(diǎn)是刪除操作比較復(fù)雜2022-04-04

