因爲QScroller至少qt5.0以上,若是版本太低,建議去看58.tablewidget模擬手指實現滑動章節,來自定義實現滑動器.html
在學習本章以前須要知道滑動的關鍵詞:app
1.QScroller類函數
用於觸摸屏的一個滑動器,實現用戶用手指來滑動視圖,有大量的參數設置能夠經過QScrollerProperties設置,它的默認值基於平臺優化值。post
2.QScrollerProperties滑動器參數類學習
QScrollerProperties類存儲QScroller使用到的參數,默認設置與平臺相關,以便Qt模擬平臺行爲進行動態滾動。固然也能夠由用戶設置參數。優化
能夠設置的參數類型有如下幾種:this
QScrollerProperties::MousePressEventDelay //設置鼠標按下的延遲時間,好比設置按下多少ms後開始真正觸發滑動器. QScrollerProperties::DragStartDistance //設置移動閥值(按下後須要移動最少多少距離後,觸發滑動),用來避免誤操做. QScrollerProperties::DragVelocitySmoothingFactor //平滑滑動速度,當滑動後手離開屏幕後,進行平滑滑動的速度,此值應介於0和1之間。值越小,速度越慢。 QScrollerProperties::DecelerationFactor //減速速度因子,減速到0速度所需的時間。對於大多數類型,該值應在0.1到2.0的範圍內 QScrollerProperties::MinimumVelocity //平滑滑動的最小速度 QScrollerProperties::MaximumVelocity //平滑滑動的最大速度 QScrollerProperties::SnapTime //滾動曲線的時間因子。設置滾動的時長,值越小,滾動時間越長. QScrollerProperties::FrameRate //設置平滑滑動的刷新頻率,能夠設置的值有以下幾種: //QScrollerProperties::Fps60 //QScrollerProperties::Fps30 //QScrollerProperties::Fps20 QScrollerProperties::VerticalOvershootPolicy //垂直越區策略
3.表格類的使用示例url
代碼以下所示:spa
table = new QTableWidget(this); table->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); QScroller* scroller = QScroller::scroller(table->viewport()); //也能夠填入直接填入table,只是點擊滑動條時會無反應. 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示例
界面以下所示:3d
固然能夠自定義icon列數,寬高,icon之間的間距,好比橫屏:
滑動效果圖以下所示:
支持界面自定義拖動,效果圖以下所示:
因爲咱們要使用QScroller,因此須要子類化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()用來初始化整個home用的.newAppIcon()用來初始化每一個app圖標用的.函數以下所示:
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()); } } }
初始化完成後,便可經過QScroller進行綁定滑動器.