Qt利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果
在學(xué)習(xí)本章之前需要知道滑動(dòng)的關(guān)鍵詞:
鼠標(biāo)按下,鼠標(biāo)滑動(dòng) : 指的是用戶(hù)按下屏幕,然后進(jìn)行移動(dòng)的操作,此時(shí)用戶(hù)滑動(dòng)多少距離,那么視圖就偏移多少距離.
平滑滑動(dòng) : 指的是手指離開(kāi)屏幕了,然后會(huì)讀取滑動(dòng)的速率(距離/時(shí)間),從而讓視圖自己平滑的再滑動(dòng)一段距離.
1.QScroller類(lèi)
用于觸摸屏的一個(gè)滑動(dòng)器,實(shí)現(xiàn)用戶(hù)用手指來(lái)滑動(dòng)視圖,有大量的參數(shù)設(shè)置可以通過(guò)QScrollerProperties設(shè)置,它的默認(rèn)值基于平臺(tái)優(yōu)化值。
2.QScrollerProperties滑動(dòng)器參數(shù)類(lèi)
QScrollerProperties類(lèi)存儲(chǔ)QScroller使用到的參數(shù),默認(rèn)設(shè)置與平臺(tái)相關(guān),以便Qt模擬平臺(tái)行為進(jìn)行動(dòng)態(tài)滾動(dòng)。當(dāng)然也可以由用戶(hù)設(shè)置參數(shù)。
可以設(shè)置的參數(shù)類(lèi)型有以下幾種:
QScrollerProperties::MousePressEventDelay //設(shè)置鼠標(biāo)按下的延遲時(shí)間,比如設(shè)置按下多少ms后開(kāi)始真正觸發(fā)滑動(dòng)器. QScrollerProperties::DragStartDistance //設(shè)置移動(dòng)閥值(按下后需要移動(dòng)最少多少距離后,觸發(fā)滑動(dòng)),用來(lái)避免誤操作. QScrollerProperties::DragVelocitySmoothingFactor //平滑滑動(dòng)速度,當(dāng)滑動(dòng)后手離開(kāi)屏幕后,進(jìn)行平滑滑動(dòng)的速度,此值應(yīng)介于0和1之間。值越小,速度越慢。 QScrollerProperties::DecelerationFactor //減速速度因子,減速到0速度所需的時(shí)間。對(duì)于大多數(shù)類(lèi)型,該值應(yīng)在0.1到2.0的范圍內(nèi) QScrollerProperties::MinimumVelocity //平滑滑動(dòng)的最小速度 QScrollerProperties::MaximumVelocity //平滑滑動(dòng)的最大速度 QScrollerProperties::SnapTime //滾動(dòng)曲線(xiàn)的時(shí)間因子。設(shè)置滾動(dòng)的時(shí)長(zhǎng),值越小,滾動(dòng)時(shí)間越長(zhǎng). QScrollerProperties::FrameRate //設(shè)置平滑滑動(dòng)的刷新頻率,可以設(shè)置的值有如下幾種: //QScrollerProperties::Fps60 //QScrollerProperties::Fps30 //QScrollerProperties::Fps20 QScrollerProperties::VerticalOvershootPolicy //垂直越區(qū)策略
3.表格類(lèi)的使用示例
代碼如下所示:
table = new QTableWidget(this); table->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); QScroller* scroller = QScroller::scroller(table->viewport()); //也可以填入直接填入table,只是點(diǎn)擊滑動(dòng)條時(shí)會(huì)無(wú)反應(yīng). scroller->grabGesture(table->viewport(),QScroller::LeftMouseButtonGesture); QScrollerProperties properties = scroller->scrollerProperties(); properties.setScrollMetric(QScrollerProperties::DragVelocitySmoothingFactor,0.3); properties.setScrollMetric(QScrollerProperties::FrameRate,QScrollerProperties::Fps60); scroller->setScrollerProperties(properties);
4.自定義home界面Demo示例
界面如下所示

當(dāng)然可以自定義icon列數(shù),寬高,icon之間的間距,比如橫屏:

滑動(dòng)效果圖如下所示:

支持界面自定義拖動(dòng),效果圖如下所示:

由于我們要使用QScroller,所以需要子類(lèi)化QTableWidget.ScrollHome.h如下所示:
class ScrollHome : public QTableWidget
{
Q_OBJECT
int iconSize;
QSize itemSize;
int iconSpacing;
int iconColumn;
QMargins margins;
QFont font;
QPalette palette;
QWidget *parent;
QPushButton* newAppButton(QWidget* app,AppRes& appRes);
QWidget* newAppIcon(AppRes& appRes);
public:
explicit ScrollHome(QWidget *parent );
void InitHome(int iconColumn, int iconSpacing, int widgetWidth, int widgetHeight );
int GetIconSize();
signals:
void appClicked(AppRes* app);
protected slots:
void onIcon();
};其中InitHome()用來(lái)初始化整個(gè)home用的.newAppIcon()用來(lái)初始化每個(gè)app圖標(biāo)用的.函數(shù)如下所示:
QWidget* ScrollHome::newAppIcon(AppRes& appRes)
{
QWidget *app = new QWidget(this);
app->setFixedSize(itemSize);
QPushButton *btn = newAppButton(app,appRes);
btn->move(iconSpacing/2,iconSpacing/2);
QLabel *label = new QLabel(appRes.appName,app);
label->setFont(font);
label->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
label->setGeometry(0,iconSize + btn->y()+4,itemSize.width(),itemSize.height()-iconSize - btn->y());
label->setPalette(palette);
return app;
}
void ScrollHome::InitHome(int iconColumn, int iconSpacing, int widgetWidth, int widgetHeight)
{
this->iconColumn = iconColumn;
this->iconSpacing = iconSpacing;
this->setFixedSize(widgetWidth, widgetHeight);
this->viewport()->setFixedWidth(widgetWidth);
iconSize = (widgetWidth - iconSpacing * iconColumn)/iconColumn;
font.setPixelSize(iconSize/5.2);
itemSize = QSize(iconSize + iconSpacing,iconSize+iconSpacing + font.pixelSize() +10);
this->setColumnCount(iconColumn);
for(int i = 0; i < iconColumn; ++i)
{
this->setColumnWidth(i,itemSize.width());
}
this->clearContents();
int rowCount = g_appResSize/iconColumn +(g_appResSize%iconColumn==0 ? 0 : 1);
this->setRowCount(rowCount);
for(int i = 0; i < rowCount; ++i) {
for(int j = 0; j < iconColumn; ++j) {
int crtIndex = i * iconColumn + j;
if(crtIndex >= g_appResSize)
break;
g_appRes[crtIndex].resIndex = crtIndex;
this->setCellWidget(i, j, newAppIcon(g_appRes[crtIndex]));
this->setRowHeight(i,itemSize.height());
}
}
}初始化完成后,即可通過(guò)QScroller進(jìn)行綁定滑動(dòng)器.
到此這篇關(guān)于Qt利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果的文章就介紹到這了,更多相關(guān)Qt QScroller界面滑動(dòng)效果內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)假裝藍(lán)屏整蠱小程序
因?yàn)楣ぷ鞯男枰?,有時(shí)候我們離開(kāi)時(shí)并不想讓別人看到我們電腦的內(nèi)容,所以本文為大家分享了一個(gè)基于C++實(shí)現(xiàn)的假裝藍(lán)屏的小程序,需要的可以參考下2023-06-06
C語(yǔ)言實(shí)現(xiàn)括號(hào)配對(duì)的方法示例
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)括號(hào)配對(duì)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
C++實(shí)現(xiàn)LeetCode(128.求最長(zhǎng)連續(xù)序列)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(128.求最長(zhǎng)連續(xù)序列),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Qt實(shí)現(xiàn)SqlRelationalTable關(guān)聯(lián)表組件
在Qt中我們可以通過(guò)拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開(kāi)發(fā)極大的方便了開(kāi)發(fā)效率,本章將重點(diǎn)介紹SqlRelationalTable關(guān)聯(lián)表組件的常用方法及靈活運(yùn)用,感興趣的可以了解一下2023-12-12
OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長(zhǎng)
區(qū)域分割是圖像處理中一個(gè)重要的任務(wù),本文主要介紹了OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長(zhǎng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02

