优化搜索结果UI刷新逻辑,添加定时器一定条件下定时刷新;

This commit is contained in:
jixiaoxu 2022-01-05 16:38:52 +08:00 committed by iaom
parent 7d5792eabb
commit 988e845d69
3 changed files with 32 additions and 10 deletions

View File

@ -26,6 +26,8 @@ SearchResultModel::SearchResultModel(const QString &plugin_id)
m_item = new SearchResultItem; m_item = new SearchResultItem;
m_plugin_id = plugin_id; m_plugin_id = plugin_id;
m_search_manager = new SearchResultManager(plugin_id); m_search_manager = new SearchResultManager(plugin_id);
m_timer = new QTimer(this);
m_timer->setInterval(500);
initConnections(); initConnections();
} }
@ -67,17 +69,22 @@ QVariant SearchResultModel::data(const QModelIndex &index, int role) const
return QVariant(); return QVariant();
} }
//bool SearchResultModel::insertRows(int row, int count, const QModelIndex &parent) void SearchResultModel::appendInfo(const SearchPluginIface::ResultInfo &info)//TODO 代码逻辑可尝试梳理优化
//{
// this->beginInsertRows(parent, row, count);
// this->endInsertRows();
// return true;
//}
void SearchResultModel::appendInfo(const SearchPluginIface::ResultInfo &info)
{ {
if (m_item->m_result_info_list.length() > 5 //搜索结果大于5个并且搜索结果处于收起状态时只存储数据无需刷新UI
and !m_isExpanded) {
m_item->m_result_info_list.append(info);
return;
}
if (m_item->m_result_info_list.length() > 50
and m_isExpanded) {//搜索结果大于50个并且搜索结果处于展开状态时只存储数据并启动定时500ms刷新一次UI
m_item->m_result_info_list.append(info);
if (!m_timer->isActive()) {
m_timer->start();
}
return;
}
this->beginResetModel(); this->beginResetModel();
//qDebug()<<"Got a result. name ="<<info.name;
m_item->m_result_info_list.append(info); m_item->m_result_info_list.append(info);
this->endResetModel(); this->endResetModel();
Q_EMIT this->itemListChanged(m_item->m_result_info_list.length()); Q_EMIT this->itemListChanged(m_item->m_result_info_list.length());
@ -101,6 +108,10 @@ void SearchResultModel::initConnections()
{ {
connect(this, &SearchResultModel::stopSearch, m_search_manager, &SearchResultManager::stopSearch); connect(this, &SearchResultModel::stopSearch, m_search_manager, &SearchResultManager::stopSearch);
connect(m_search_manager, &SearchResultManager::gotResultInfo, this, &SearchResultModel::appendInfo); connect(m_search_manager, &SearchResultManager::gotResultInfo, this, &SearchResultModel::appendInfo);
connect(m_timer, &QTimer::timeout, [ = ] () {//500ms刷新一次UI,防止搜索结果数据量过大导致的UI卡顿
Q_EMIT this->itemListChanged(m_item->m_result_info_list.length());
m_timer->stop();
});
} }
const SearchPluginIface::ResultInfo &SearchResultModel::getInfo(const QModelIndex &index) const SearchPluginIface::ResultInfo &SearchResultModel::getInfo(const QModelIndex &index)
@ -140,6 +151,12 @@ QString SearchResultModel::getKey(const QModelIndex &index)
return NULL; return NULL;
} }
void SearchResultModel::refresh()
{
this->beginResetModel();
this->endResetModel();
}
SearchResultItem::SearchResultItem(QObject *parent) : QObject(parent) SearchResultItem::SearchResultItem(QObject *parent) : QObject(parent)
{ {

View File

@ -56,6 +56,7 @@ public:
const bool &isExpanded(); const bool &isExpanded();
QStringList getActions(const QModelIndex &); QStringList getActions(const QModelIndex &);
QString getKey(const QModelIndex &); QString getKey(const QModelIndex &);
void refresh();
public Q_SLOTS: public Q_SLOTS:
void appendInfo(const SearchPluginIface::ResultInfo &); void appendInfo(const SearchPluginIface::ResultInfo &);
@ -72,6 +73,7 @@ private:
QString m_plugin_id; QString m_plugin_id;
SearchResultManager * m_search_manager = nullptr; SearchResultManager * m_search_manager = nullptr;
bool m_isExpanded = false; bool m_isExpanded = false;
QTimer * m_timer;
}; };
} }

View File

@ -262,6 +262,9 @@ void ResultView::onItemListChanged(const int &count)
{ {
m_count = count; m_count = count;
Q_EMIT this->listLengthChanged(count); Q_EMIT this->listLengthChanged(count);
QModelIndex index = this->currentIndex();
m_model->refresh();
this->setCurrentIndex(index);
} }
void ResultView::setExpanded(const bool &is_expanded) void ResultView::setExpanded(const bool &is_expanded)