最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決

 更新時間:2023年07月17日 09:27:52   作者:Sweet?hort  
本文主要介紹了QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

最近在模仿網(wǎng)易云音樂的UI,積累自己的代碼能力,在使用QTabbleWidget的時候發(fā)現(xiàn)加載大量數(shù)據(jù)會導(dǎo)致卡頓,這個不能忍。

原因

設(shè)置了自適應(yīng)寬度

// item 水平表頭自適應(yīng)大小
	tab->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
	// item 垂直表頭自適應(yīng)大小
	ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
 	//試著設(shè)置為:  QHeaderView::Fixed 看看是否還會卡頓

加載的數(shù)據(jù)太大

解決方案

  • QTableView 配合 Model (推薦)
  • 我們知道 QTableWidget 每次顯示的數(shù)據(jù)有限(屏幕只有這么大),我們利用這一點來實現(xiàn)動態(tài)加載item,解決卡頓的問題
  • 使用事件過濾器,或者 重寫鼠標事件,
//需要重寫的虛函數(shù)
	virtual void wheelEvent(QWheelEvent* event)
	//事件過濾器
	virtual bool eventFilter(QObject* obj, QEvent* event)

舉例說明

1.我們首先先加載一定量的數(shù)據(jù),這樣就不會卡了。

2.為了防止越界,每次循環(huán)我們都應(yīng)該判斷一下

3.用一個 curtableindex 來記錄當前數(shù)據(jù)的位置,方便之后加載剩余的數(shù)據(jù)

void SongMenu::loadData()
{
	int len = taglsit.length();
	for (int i = 0; i != 20; ++i) {
		if (i >= len)return;
		ui->tab_SongTable->insertRow(i);
		//添加窗口小部件
		ui->tab_SongTable->setCellWidget(i, 0, base->setItemWidget(1));
		QTableWidgetItem* item1 = new QTableWidgetItem(taglsit.at(i).Title);
		QTableWidgetItem* item2 = new QTableWidgetItem(taglsit.at(i).Artist);
		QTableWidgetItem* item3 = new QTableWidgetItem(taglsit.at(i).Ablue);
		QTableWidgetItem* item4 = new QTableWidgetItem(taglsit.at(i).Duration);
		ui->tab_SongTable->setItem(i, 1, item1);
		ui->tab_SongTable->setItem(i, 2, item2);
		ui->tab_SongTable->setItem(i, 3, item3);
		ui->tab_SongTable->setItem(i, 4, item4);
	}
	curtableindex = 20;
	//下面例子是加載大量數(shù)據(jù)會卡頓,原因:一次性把所有的數(shù)據(jù)都添加了且設(shè)置了自適應(yīng)寬度
	/*foreach(const Temptag & rhs, taglsit) {
		ui->tab_SongTable->insertRow(index);
		ui->tab_SongTable->setCellWidget(index, 0, base->setItemWidget(1));
		QTableWidgetItem* item1 = new QTableWidgetItem(rhs.Artist);
		QTableWidgetItem* item2 = new QTableWidgetItem(rhs.Title);
		QTableWidgetItem* item3 = new QTableWidgetItem(rhs.Ablue);
		QTableWidgetItem* item4 = new QTableWidgetItem(rhs.Duration);
		ui->tab_SongTable->setItem(index, 1, item1);
		ui->tab_SongTable->setItem(index, 2, item2);
		ui->tab_SongTable->setItem(index, 3, item3);
		ui->tab_SongTable->setItem(index, 4, item4);
	}*/
}

插入以后的效果圖

這里并沒有加載全部的數(shù)據(jù)。

重新鼠標事件

函數(shù)原型:

virtual void wheelEvent(QWheelEvent* event)

wheelEvent() 實現(xiàn)方法

void Base::wheelEvent(QWheelEvent* event)
{
	//滑動一次 y() == 120
	//y() > 0 鼠標滾輪向前滑動, y() < 0 鼠標滾輪向自己滑動
	if (event->angleDelta().y() < 0) {
		emit loadNextPage();
	}
}

事件過濾器

函數(shù)原型:

virtual bool eventFilter(QObject* obj, QEvent* event)

eventFilter() 實現(xiàn)方法

bool Base::eventFilter(QObject* obj, QEvent* event)
{
	if (obj == tab) {
		if (event->type() == QEvent::Wheel) {
			QWheelEvent* wheel = static_cast<QWheelEvent*>(event);
			//y() < 0 鼠標滾輪向自己滑動 
			if (wheel->angleDelta().y() < 0) {
				//發(fā)射信號,然后處理數(shù)據(jù)
				emit loadNextPage(); 
			}
		}
	}
	return QTableWidget::eventFilter(obj,event);
}
//然后在 構(gòu)造函數(shù)中安裝事件過濾器
ui->tab_SongTable->installEventFilter(this);

實現(xiàn)滑動加載

前面已經(jīng)實現(xiàn)了事件過濾器,和重寫鼠標事件,接下來就是加載數(shù)據(jù)了,方法很簡單,只要連接信號,然后加載數(shù)據(jù)就行了

//加載剩余的數(shù)據(jù)
	connect(base, &Base::loadNextPage, this, [&]() {
	//每次滾動到底部都加載5條數(shù)據(jù),和前面一樣,檢查邊界,以防越界
		for (int i = 0; i != 5; i++) {
			if (curtableindex >= taglsit.length()) {
				return;
			}
			else
			{
				//拿到ui->tab_SongTable尾部的索引,之后往尾部添加數(shù)據(jù)
				int currow = ui->tab_SongTable->rowCount();
				ui->tab_SongTable->insertRow(currow);
				ui->tab_SongTable->setCellWidget(currow, 0, base->setItemWidget(1));
				QTableWidgetItem* item1 = new QTableWidgetItem(taglsit.at(currow).Title);
				QTableWidgetItem* item2 = new QTableWidgetItem(taglsit.at(currow).Artist);
				QTableWidgetItem* item3 = new QTableWidgetItem(taglsit.at(currow).Ablue);
				QTableWidgetItem* item4 = new QTableWidgetItem(taglsit.at(currow).Duration);
				ui->tab_SongTable->setItem(currow, 1, item1);
				ui->tab_SongTable->setItem(currow, 2, item2);
				ui->tab_SongTable->setItem(currow, 3, item3);
				ui->tab_SongTable->setItem(currow, 4, item4);
			}
			//累加索引,防止越界
			++curtableindex ;
		}
		});

總結(jié):

到此這篇關(guān)于QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決的文章就介紹到這了,更多相關(guān)QT中QTableWidget加載卡頓內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++命名空間 namespace詳解

    C++命名空間 namespace詳解

    定義命名空間,使用namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對花括號{ } 即可,{ }中即為命名空間的成員,這篇文章主要介紹了C++命名空間 namespace,需要的朋友可以參考下
    2023-04-04
  • Qt實現(xiàn)電子時鐘

    Qt實現(xiàn)電子時鐘

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)電子時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++中靜態(tài)初始化數(shù)組與動態(tài)初始化數(shù)組詳解

    C++中靜態(tài)初始化數(shù)組與動態(tài)初始化數(shù)組詳解

    今天小編就為大家分享一篇C++中靜態(tài)初始化數(shù)組與動態(tài)初始化數(shù)組詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C++ map 根據(jù)value找key的實現(xiàn)

    C++ map 根據(jù)value找key的實現(xiàn)

    今天小編就為大家分享一篇C++ map 根據(jù)value找key的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C/C++中多重繼承詳解及其作用介紹

    C/C++中多重繼承詳解及其作用介紹

    這篇文章主要介紹了C/C++中多重繼承詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • OpenCV實現(xiàn)最小外接正矩形

    OpenCV實現(xiàn)最小外接正矩形

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)最小外接正矩形,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 實例講解在C++的函數(shù)中變量參數(shù)及默認參數(shù)的使用

    實例講解在C++的函數(shù)中變量參數(shù)及默認參數(shù)的使用

    這篇文章主要介紹了在C++的函數(shù)中變量參數(shù)及默認參數(shù)的使用,是C++函數(shù)入門學(xué)習中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C++中的STL常用算法之遍歷算法詳解

    C++中的STL常用算法之遍歷算法詳解

    這篇文章主要介紹了C++中的STL常用算法之遍歷算法詳解,ransform() 可以將函數(shù)應(yīng)用到容器的元素上,并將這個函數(shù)返回的值保存到另一個容器中,它返回的迭代器指向輸出容器所保存的最后一個元素的下一個位置,需要的朋友可以參考下
    2023-12-12
  • C++取得本機IP的方法

    C++取得本機IP的方法

    這篇文章主要介紹了C++取得本機IP的方法,代碼簡單功能實用,具有不錯的借鑒參考價值,需要的朋友可以參考下
    2014-10-10
  • C++不使用變量求字符串長度strlen函數(shù)的實現(xiàn)方法

    C++不使用變量求字符串長度strlen函數(shù)的實現(xiàn)方法

    這篇文章主要介紹了C++不使用變量求字符串長度strlen函數(shù)的實現(xiàn)方法,實例分析了strlen函數(shù)的實現(xiàn)原理與不使用變量求字符串長度的實現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06

最新評論

乐安县| 西乌珠穆沁旗| 焉耆| 杭锦旗| 灌南县| 自治县| 蒙山县| 宁蒗| 隆昌县| 宣武区| 桦甸市| 宝应县| 邵阳县| 衡阳市| 诸城市| 舞阳县| 东至县| 郁南县| 读书| 西平县| 岱山县| 弥渡县| 丹东市| 离岛区| 盐池县| 屏东市| 康乐县| 遂平县| 呈贡县| 马龙县| 石河子市| 辽中县| 西丰县| 樟树市| 越西县| 门源| 洪泽县| 家居| 青海省| 盈江县| 东莞市|