亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

QT中QTableWidget加載大量數據不卡頓的解決

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

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

原因

設置了自適應寬度

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

加載的數據太大

解決方案

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

舉例說明

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

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

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

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;
	//下面例子是加載大量數據會卡頓,原因:一次性把所有的數據都添加了且設置了自適應寬度
	/*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);
	}*/
}

插入以后的效果圖

這里并沒有加載全部的數據。

重新鼠標事件

函數原型:

virtual void wheelEvent(QWheelEvent* event)

wheelEvent() 實現方法

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

事件過濾器

函數原型:

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

eventFilter() 實現方法

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ā)射信號,然后處理數據
				emit loadNextPage(); 
			}
		}
	}
	return QTableWidget::eventFilter(obj,event);
}
//然后在 構造函數中安裝事件過濾器
ui->tab_SongTable->installEventFilter(this);

實現滑動加載

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

//加載剩余的數據
	connect(base, &Base::loadNextPage, this, [&]() {
	//每次滾動到底部都加載5條數據,和前面一樣,檢查邊界,以防越界
		for (int i = 0; i != 5; i++) {
			if (curtableindex >= taglsit.length()) {
				return;
			}
			else
			{
				//拿到ui->tab_SongTable尾部的索引,之后往尾部添加數據
				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 ;
		}
		});

總結:

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

相關文章

  • C++?Qt實現動態(tài)增加垂直滾動條

    C++?Qt實現動態(tài)增加垂直滾動條

    本博文源于筆者正在工作的一個小內容,內容涉及到為qt動態(tài)增加垂直滾動條,文章分為三個部分,問題起源,問題解決方案,問題解決成功效果,思路清晰,文章干貨滿滿,復制源碼即可使用,需要的朋友可以參考下
    2023-08-08
  • C語言實現靜態(tài)版通訊錄的代碼分享

    C語言實現靜態(tài)版通訊錄的代碼分享

    這篇文章主要為大家詳細介紹了如何利用C語言實現一個簡單的靜態(tài)版通訊錄,主要運用了結構體,一維數組,函數,分支與循環(huán)語句等等知識,需要的可以參考一下
    2023-01-01
  • vsCode配置import@路徑提示的實現步驟

    vsCode配置import@路徑提示的實現步驟

    在導入文件設置路徑的時候方便了很多,本文主要介紹了vsCode配置import@路徑提示的實現步驟,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • C語言學習之關鍵字的示例詳解

    C語言學習之關鍵字的示例詳解

    關鍵字,這名字一聽,就很關鍵。而有些關鍵字,你可能不是很了解,更別談使用。所以,這篇文章將帶你見識常見的關鍵字,一起領略它們的風采吧
    2022-10-10
  • C語言宏定義的擴展定義講解

    C語言宏定義的擴展定義講解

    這篇文章主要介紹了C語言宏定義的擴展,宏定義是C語言提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯
    2022-12-12
  • 純C語言:遞歸組合數源碼分享

    純C語言:遞歸組合數源碼分享

    這篇文章主要介紹了純C語言:遞歸組合數源碼,有需要的朋友可以參考一下
    2014-01-01
  • C++?Boost?Lambda表達式詳解

    C++?Boost?Lambda表達式詳解

    Lambda?表達式(lambda?expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名。本文就來為大家詳細講講C++中Lambda表達式的使用,需要的可以參考一下
    2022-11-11
  • C語言實現萬年歷效果

    C語言實現萬年歷效果

    這篇文章主要為大家詳細介紹了C語言實現萬年歷效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 使用C語言實現三子棋游戲

    使用C語言實現三子棋游戲

    這篇文章主要為大家詳細介紹了使用C語言實現三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++語言 STL容器list總結

    C++語言 STL容器list總結

    這篇文章主要介紹了C++語言 STL容器list總結的相關資料,需要的朋友可以參考下
    2016-10-10

最新評論