forked from openkylin/ukui-search
增加了一个用于调试的索引状态监控页面,可通过'ukui-search-service -m'打开.
This commit is contained in:
parent
8611cf74b6
commit
3af1582eb1
|
@ -28,7 +28,7 @@
|
||||||
#include "file-content-indexer.h"
|
#include "file-content-indexer.h"
|
||||||
#include "writable-database.h"
|
#include "writable-database.h"
|
||||||
using namespace UkuiSearch;
|
using namespace UkuiSearch;
|
||||||
FirstRunIndexer::FirstRunIndexer(const QStringList &folders, const QStringList &blackList, QAtomicInt& stop, WorkModes mode, Targets target)
|
FirstRunIndexer::FirstRunIndexer(const QStringList &folders, const QStringList &blackList, QAtomicInt& stop, WorkMode mode, Targets target)
|
||||||
: m_folders(folders),
|
: m_folders(folders),
|
||||||
m_blackList(blackList),
|
m_blackList(blackList),
|
||||||
m_stop(&stop),
|
m_stop(&stop),
|
||||||
|
@ -58,7 +58,7 @@ void FirstRunIndexer::run()
|
||||||
m_cache.clear();
|
m_cache.clear();
|
||||||
malloc_trim(0);
|
malloc_trim(0);
|
||||||
qDebug() << "FirstRunIndexer: time :" << t.elapsed();
|
qDebug() << "FirstRunIndexer: time :" << t.elapsed();
|
||||||
Q_EMIT done();
|
Q_EMIT done(m_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirstRunIndexer::fetch()
|
void FirstRunIndexer::fetch()
|
||||||
|
|
|
@ -41,7 +41,7 @@ public:
|
||||||
Add = 1,
|
Add = 1,
|
||||||
Rebuild
|
Rebuild
|
||||||
};
|
};
|
||||||
Q_DECLARE_FLAGS(WorkModes, WorkMode)
|
Q_ENUM(WorkMode)
|
||||||
/**
|
/**
|
||||||
* @brief The Target enum
|
* @brief The Target enum
|
||||||
* 要进行索引的数据库
|
* 要进行索引的数据库
|
||||||
|
@ -57,7 +57,7 @@ public:
|
||||||
};
|
};
|
||||||
Q_DECLARE_FLAGS(Targets, Target)
|
Q_DECLARE_FLAGS(Targets, Target)
|
||||||
|
|
||||||
FirstRunIndexer(const QStringList& folders, const QStringList& blackList, QAtomicInt& stop, WorkModes mode = WorkMode::Update, Targets target = Target::All);
|
FirstRunIndexer(const QStringList& folders, const QStringList& blackList, QAtomicInt& stop, WorkMode mode = WorkMode::Update, Targets target = Target::All);
|
||||||
~FirstRunIndexer();
|
~FirstRunIndexer();
|
||||||
void run() override;
|
void run() override;
|
||||||
|
|
||||||
|
@ -65,14 +65,14 @@ Q_SIGNALS:
|
||||||
void progress(IndexType type, uint all, uint finished);
|
void progress(IndexType type, uint all, uint finished);
|
||||||
void basicIndexDone(int size);
|
void basicIndexDone(int size);
|
||||||
void contentIndexDone(int size);
|
void contentIndexDone(int size);
|
||||||
void done();
|
void done(WorkMode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void fetch();
|
void fetch();
|
||||||
void basicIndex();
|
void basicIndex();
|
||||||
void contentIndex();
|
void contentIndex();
|
||||||
|
|
||||||
WorkModes m_mode;
|
WorkMode m_mode;
|
||||||
Targets m_target;
|
Targets m_target;
|
||||||
QStringList m_folders;
|
QStringList m_folders;
|
||||||
QStringList m_blackList;
|
QStringList m_blackList;
|
||||||
|
|
|
@ -29,6 +29,7 @@ IndexScheduler::IndexScheduler(QObject *parent) :
|
||||||
m_stop(0)
|
m_stop(0)
|
||||||
{
|
{
|
||||||
qRegisterMetaType<IndexerState>("IndexerState");
|
qRegisterMetaType<IndexerState>("IndexerState");
|
||||||
|
qRegisterMetaType<FirstRunIndexer::WorkMode>("FirstRunIndexer::WorkMode");
|
||||||
m_threadPool.setMaxThreadCount(1);
|
m_threadPool.setMaxThreadCount(1);
|
||||||
connect(&m_fileWatcher, &FileWatcher::filesUpdate, this, &IndexScheduler::updateIndex);
|
connect(&m_fileWatcher, &FileWatcher::filesUpdate, this, &IndexScheduler::updateIndex);
|
||||||
connect(m_config, &FileIndexerConfig::fileIndexEnableStatusChanged, this, &IndexScheduler::fileIndexEnable);
|
connect(m_config, &FileIndexerConfig::fileIndexEnableStatusChanged, this, &IndexScheduler::fileIndexEnable);
|
||||||
|
@ -50,6 +51,7 @@ void IndexScheduler::addNewPath(const QString &folders, const QStringList &black
|
||||||
}
|
}
|
||||||
m_isAddNewPathFinished = false;
|
m_isAddNewPathFinished = false;
|
||||||
m_state = Running;
|
m_state = Running;
|
||||||
|
Q_EMIT stateChange(m_state);
|
||||||
FirstRunIndexer::Targets target = FirstRunIndexer::Target::None;
|
FirstRunIndexer::Targets target = FirstRunIndexer::Target::None;
|
||||||
if(m_config->isFileIndexEnable()) {
|
if(m_config->isFileIndexEnable()) {
|
||||||
target |= FirstRunIndexer::Target::Basic;
|
target |= FirstRunIndexer::Target::Basic;
|
||||||
|
@ -57,10 +59,9 @@ void IndexScheduler::addNewPath(const QString &folders, const QStringList &black
|
||||||
if(m_config->isContentIndexEnable()) {
|
if(m_config->isContentIndexEnable()) {
|
||||||
target |= FirstRunIndexer::Target::Content;
|
target |= FirstRunIndexer::Target::Content;
|
||||||
}
|
}
|
||||||
|
FirstRunIndexer::WorkMode mode = FirstRunIndexer::WorkMode::Add;
|
||||||
|
startIndexJob(QStringList() << folders, blackList, mode, target);
|
||||||
if(FirstRunIndexer::Target::None != target) {
|
if(FirstRunIndexer::Target::None != target) {
|
||||||
FirstRunIndexer *indexer = new FirstRunIndexer(QStringList(folders), blackList, m_stop, FirstRunIndexer::WorkMode::Add, target);
|
|
||||||
connect(indexer, &FirstRunIndexer::done, this, &IndexScheduler::addNewPathFinished, Qt::QueuedConnection);
|
|
||||||
m_threadPool.start(indexer);
|
|
||||||
m_fileWatcher.addWatch(folders, blackList);
|
m_fileWatcher.addWatch(folders, blackList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,7 +97,7 @@ void IndexScheduler::scheduleIndexing()
|
||||||
Q_EMIT stateChange(m_state);
|
Q_EMIT stateChange(m_state);
|
||||||
FirstRunIndexer::Targets rebuiltTarget = checkAndRebuild();
|
FirstRunIndexer::Targets rebuiltTarget = checkAndRebuild();
|
||||||
|
|
||||||
FirstRunIndexer::WorkModes mode = FirstRunIndexer::WorkMode::Update;
|
FirstRunIndexer::WorkMode mode = FirstRunIndexer::WorkMode::Update;
|
||||||
FirstRunIndexer::Targets target = FirstRunIndexer::Target::None;
|
FirstRunIndexer::Targets target = FirstRunIndexer::Target::None;
|
||||||
|
|
||||||
//如果数据库被执行过重建,那么跳过增量更新步骤。
|
//如果数据库被执行过重建,那么跳过增量更新步骤。
|
||||||
|
@ -108,7 +109,7 @@ void IndexScheduler::scheduleIndexing()
|
||||||
target |= FirstRunIndexer::Target::Content;
|
target |= FirstRunIndexer::Target::Content;
|
||||||
m_statusRecorder->setStatus(CONTENT_INDEX_DATABASE_STATE_KEY, IndexStatusRecorder::State::Updating);
|
m_statusRecorder->setStatus(CONTENT_INDEX_DATABASE_STATE_KEY, IndexStatusRecorder::State::Updating);
|
||||||
}
|
}
|
||||||
startIndexJob(mode, target);
|
startIndexJob(m_config->currentIndexableDir(), m_config->currentBlackListOfIndex(), mode, target);
|
||||||
|
|
||||||
//启动监听
|
//启动监听
|
||||||
m_fileWatcher.installWatches();
|
m_fileWatcher.installWatches();
|
||||||
|
@ -121,7 +122,7 @@ IndexScheduler::IndexerState IndexScheduler::getIndexState()
|
||||||
|
|
||||||
FirstRunIndexer::Targets IndexScheduler::checkAndRebuild()
|
FirstRunIndexer::Targets IndexScheduler::checkAndRebuild()
|
||||||
{
|
{
|
||||||
FirstRunIndexer::WorkModes mode = FirstRunIndexer::WorkMode::Rebuild;
|
FirstRunIndexer::WorkMode mode = FirstRunIndexer::WorkMode::Rebuild;
|
||||||
FirstRunIndexer::Targets target = FirstRunIndexer::Target::None;
|
FirstRunIndexer::Targets target = FirstRunIndexer::Target::None;
|
||||||
if((m_statusRecorder->getStatus(INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Error || !m_statusRecorder->versionCheck(INDEX_DATABASE_VERSION_KEY, INDEX_DATABASE_VERSION))
|
if((m_statusRecorder->getStatus(INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Error || !m_statusRecorder->versionCheck(INDEX_DATABASE_VERSION_KEY, INDEX_DATABASE_VERSION))
|
||||||
&& m_config->isFileIndexEnable()) {
|
&& m_config->isFileIndexEnable()) {
|
||||||
|
@ -136,14 +137,14 @@ FirstRunIndexer::Targets IndexScheduler::checkAndRebuild()
|
||||||
target |= FirstRunIndexer::Target::Content;
|
target |= FirstRunIndexer::Target::Content;
|
||||||
m_statusRecorder->setStatus(CONTENT_INDEX_DATABASE_STATE_KEY, IndexStatusRecorder::State::Initializing);
|
m_statusRecorder->setStatus(CONTENT_INDEX_DATABASE_STATE_KEY, IndexStatusRecorder::State::Initializing);
|
||||||
}
|
}
|
||||||
startIndexJob(mode, target);
|
startIndexJob(m_config->currentIndexableDir(), m_config->currentBlackListOfIndex(), mode, target);
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndexScheduler::startIndexJob(FirstRunIndexer::WorkModes &mode, FirstRunIndexer::Targets &target)
|
void IndexScheduler::startIndexJob(const QStringList& folders,const QStringList& blackList, FirstRunIndexer::WorkMode mode, FirstRunIndexer::Targets target)
|
||||||
{
|
{
|
||||||
if(FirstRunIndexer::Target::None != target) {
|
if(FirstRunIndexer::Target::None != target) {
|
||||||
FirstRunIndexer *indexer = new FirstRunIndexer(m_config->currentIndexableDir(), m_config->currentBlackListOfIndex(), m_stop, mode, target);
|
FirstRunIndexer *indexer = new FirstRunIndexer(folders, blackList, m_stop, mode, target);
|
||||||
connect(indexer, &FirstRunIndexer::done, this, &IndexScheduler::firstRunFinished, Qt::QueuedConnection);
|
connect(indexer, &FirstRunIndexer::done, this, &IndexScheduler::firstRunFinished, Qt::QueuedConnection);
|
||||||
connect(indexer, &FirstRunIndexer::progress, this, &IndexScheduler::process);
|
connect(indexer, &FirstRunIndexer::progress, this, &IndexScheduler::process);
|
||||||
|
|
||||||
|
@ -188,13 +189,25 @@ void IndexScheduler::updateIndex(const QVector<PendingFile> &files)
|
||||||
m_threadPool.start(updateJob);
|
m_threadPool.start(updateJob);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndexScheduler::firstRunFinished()
|
void IndexScheduler::firstRunFinished(FirstRunIndexer::WorkMode mode)
|
||||||
{
|
{
|
||||||
if((m_statusRecorder->getStatus(INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Ready)
|
if((m_statusRecorder->getStatus(INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Ready)
|
||||||
&& m_statusRecorder->getStatus(CONTENT_INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Ready) {
|
&& m_statusRecorder->getStatus(CONTENT_INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Ready) {
|
||||||
m_isFirstRunFinished = true;
|
switch (mode) {
|
||||||
|
case FirstRunIndexer::WorkMode::Add:
|
||||||
|
m_isAddNewPathFinished = true;
|
||||||
|
break;
|
||||||
|
case FirstRunIndexer::WorkMode::Rebuild:
|
||||||
|
m_isRebuildFinished = true;
|
||||||
|
break;
|
||||||
|
case FirstRunIndexer::WorkMode::Update:
|
||||||
|
m_isFirstRunFinished = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(m_isFirstRunFinished && m_isAddNewPathFinished && m_isUpdateFinished) {
|
if(isIdle()) {
|
||||||
m_state = Idle;
|
m_state = Idle;
|
||||||
Q_EMIT stateChange(m_state);
|
Q_EMIT stateChange(m_state);
|
||||||
}
|
}
|
||||||
|
@ -203,18 +216,13 @@ void IndexScheduler::firstRunFinished()
|
||||||
void IndexScheduler::updateFinished()
|
void IndexScheduler::updateFinished()
|
||||||
{
|
{
|
||||||
m_isUpdateFinished = true;
|
m_isUpdateFinished = true;
|
||||||
if(m_isFirstRunFinished && m_isAddNewPathFinished) {
|
if(isIdle()) {
|
||||||
m_state = Idle;
|
m_state = Idle;
|
||||||
Q_EMIT stateChange(m_state);
|
Q_EMIT stateChange(m_state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndexScheduler::addNewPathFinished()
|
bool IndexScheduler::isIdle()
|
||||||
{
|
{
|
||||||
m_isAddNewPathFinished = true;
|
return m_isFirstRunFinished && m_isAddNewPathFinished && m_isUpdateFinished && m_isRebuildFinished;
|
||||||
if(m_isFirstRunFinished && m_isUpdateFinished) {
|
|
||||||
m_state = Idle;
|
|
||||||
Q_EMIT stateChange(m_state);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,9 +68,9 @@ Q_SIGNALS:
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void fileIndexEnable(bool enable);
|
void fileIndexEnable(bool enable);
|
||||||
void updateIndex(const QVector<PendingFile>& files);
|
void updateIndex(const QVector<PendingFile>& files);
|
||||||
void firstRunFinished();
|
void firstRunFinished(FirstRunIndexer::WorkMode mode);
|
||||||
void updateFinished();
|
void updateFinished();
|
||||||
void addNewPathFinished();
|
bool isIdle();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
|
@ -79,7 +79,7 @@ private:
|
||||||
* @return 返回需要重建的数据库
|
* @return 返回需要重建的数据库
|
||||||
*/
|
*/
|
||||||
FirstRunIndexer::Targets checkAndRebuild();
|
FirstRunIndexer::Targets checkAndRebuild();
|
||||||
void startIndexJob(FirstRunIndexer::WorkModes &mode, FirstRunIndexer::Targets &target);
|
void startIndexJob(const QStringList &folders, const QStringList &blackList, FirstRunIndexer::WorkMode mode, FirstRunIndexer::Targets target);
|
||||||
FileWatcher m_fileWatcher;
|
FileWatcher m_fileWatcher;
|
||||||
IndexStatusRecorder *m_statusRecorder = nullptr;
|
IndexStatusRecorder *m_statusRecorder = nullptr;
|
||||||
FileIndexerConfig *m_config = nullptr;
|
FileIndexerConfig *m_config = nullptr;
|
||||||
|
@ -88,6 +88,7 @@ private:
|
||||||
QThreadPool m_threadPool;
|
QThreadPool m_threadPool;
|
||||||
|
|
||||||
bool m_isFirstRunFinished = true;
|
bool m_isFirstRunFinished = true;
|
||||||
|
bool m_isRebuildFinished = true;
|
||||||
bool m_isUpdateFinished = true;
|
bool m_isUpdateFinished = true;
|
||||||
bool m_isAddNewPathFinished = true;
|
bool m_isAddNewPathFinished = true;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,4 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022, KylinSoft Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*
|
||||||
|
*/
|
||||||
#include "monitor.h"
|
#include "monitor.h"
|
||||||
|
#include <QMetaEnum>
|
||||||
#include "file-indexer-config.h"
|
#include "file-indexer-config.h"
|
||||||
using namespace UkuiSearch;
|
using namespace UkuiSearch;
|
||||||
Monitor::Monitor(IndexScheduler *scheduler, QObject *parent)
|
Monitor::Monitor(IndexScheduler *scheduler, QObject *parent)
|
||||||
|
@ -7,9 +27,10 @@ Monitor::Monitor(IndexScheduler *scheduler, QObject *parent)
|
||||||
m_basicDatabase(DataBaseType::Basic),
|
m_basicDatabase(DataBaseType::Basic),
|
||||||
m_contentDatabase(DataBaseType::Content)
|
m_contentDatabase(DataBaseType::Content)
|
||||||
{
|
{
|
||||||
connect(scheduler, &IndexScheduler::stateChange, this, &Monitor::indexStateChanged);
|
|
||||||
connect(scheduler, &IndexScheduler::stateChange, this, &Monitor::onIndexStateChanged);
|
connect(scheduler, &IndexScheduler::stateChange, this, &Monitor::onIndexStateChanged);
|
||||||
connect(scheduler, &IndexScheduler::process, this, &Monitor::processUpdate);
|
connect(scheduler, &IndexScheduler::process, this, &Monitor::processUpdate);
|
||||||
|
connect(scheduler, &IndexScheduler::basicIndexDone, this, &Monitor::basicIndexDone);
|
||||||
|
connect(scheduler, &IndexScheduler::contentIndexDone, this, &Monitor::contentIndexDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList Monitor::getCurrentIndexPaths()
|
QStringList Monitor::getCurrentIndexPaths()
|
||||||
|
@ -17,9 +38,10 @@ QStringList Monitor::getCurrentIndexPaths()
|
||||||
return FileIndexerConfig::getInstance()->currentIndexableDir();
|
return FileIndexerConfig::getInstance()->currentIndexableDir();
|
||||||
}
|
}
|
||||||
|
|
||||||
IndexScheduler::IndexerState Monitor::getIndexState()
|
QString Monitor::getIndexState()
|
||||||
{
|
{
|
||||||
return m_scheduler->getIndexState();
|
QMetaEnum metaEnum = QMetaEnum::fromType<IndexScheduler::IndexerState>();
|
||||||
|
return QString::fromLocal8Bit(metaEnum.valueToKey(m_scheduler->getIndexState()));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint Monitor::getBasicIndexSize()
|
uint Monitor::getBasicIndexSize()
|
||||||
|
@ -68,6 +90,8 @@ void Monitor::onIndexStateChanged(IndexScheduler::IndexerState state)
|
||||||
Q_EMIT basicIndexDocNumUpdate(m_basicDatabase.getIndexDocCount());
|
Q_EMIT basicIndexDocNumUpdate(m_basicDatabase.getIndexDocCount());
|
||||||
Q_EMIT contentIndexDocNumUpdate(m_contentDatabase.getIndexDocCount());
|
Q_EMIT contentIndexDocNumUpdate(m_contentDatabase.getIndexDocCount());
|
||||||
}
|
}
|
||||||
|
QMetaEnum metaEnum = QMetaEnum::fromType<IndexScheduler::IndexerState>();
|
||||||
|
Q_EMIT indexStateChanged(QString::fromLocal8Bit(metaEnum.valueToKey(state)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Monitor::processUpdate(IndexType type, uint all, uint finished)
|
void Monitor::processUpdate(IndexType type, uint all, uint finished)
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022, KylinSoft Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*
|
||||||
|
*/
|
||||||
#ifndef MONITOR_H
|
#ifndef MONITOR_H
|
||||||
#define MONITOR_H
|
#define MONITOR_H
|
||||||
|
|
||||||
|
@ -14,7 +33,7 @@ class Monitor : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(QStringList currentIndexPaths READ getCurrentIndexPaths)
|
Q_PROPERTY(QStringList currentIndexPaths READ getCurrentIndexPaths)
|
||||||
Q_PROPERTY(IndexScheduler::IndexerState indexState READ getIndexState NOTIFY indexStateChanged)
|
Q_PROPERTY(QString indexState READ getIndexState NOTIFY indexStateChanged)
|
||||||
Q_PROPERTY(uint basicIndexSize READ getBasicIndexSize NOTIFY basicIndexSizeChange)
|
Q_PROPERTY(uint basicIndexSize READ getBasicIndexSize NOTIFY basicIndexSizeChange)
|
||||||
Q_PROPERTY(uint contentIndexSize READ getContentIndexSize NOTIFY contentIndexSizeChange)
|
Q_PROPERTY(uint contentIndexSize READ getContentIndexSize NOTIFY contentIndexSizeChange)
|
||||||
Q_PROPERTY(uint ocrIndexSize READ getOCRIndexSize NOTIFY ocrIndexSizeChange)
|
Q_PROPERTY(uint ocrIndexSize READ getOCRIndexSize NOTIFY ocrIndexSizeChange)
|
||||||
|
@ -26,28 +45,114 @@ class Monitor : public QObject
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Monitor(IndexScheduler* scheduler, QObject *parent = nullptr);
|
explicit Monitor(IndexScheduler* scheduler, QObject *parent = nullptr);
|
||||||
|
/**
|
||||||
|
* @brief getCurrentIndexPaths
|
||||||
|
* @return 当前索引的所有目录
|
||||||
|
*/
|
||||||
QStringList getCurrentIndexPaths();
|
QStringList getCurrentIndexPaths();
|
||||||
IndexScheduler::IndexerState getIndexState();
|
/**
|
||||||
|
* @brief getIndexState
|
||||||
|
* @return 当前索引调度器的状态
|
||||||
|
*/
|
||||||
|
QString getIndexState();
|
||||||
|
/**
|
||||||
|
* @brief getBasicIndexSize
|
||||||
|
* @return 当前需要处理的基础索引数量
|
||||||
|
*/
|
||||||
uint getBasicIndexSize();
|
uint getBasicIndexSize();
|
||||||
|
/**
|
||||||
|
* @brief getContentIndexSize
|
||||||
|
* @return 当前需要处理的内容索引数量
|
||||||
|
*/
|
||||||
uint getContentIndexSize();
|
uint getContentIndexSize();
|
||||||
|
/**
|
||||||
|
* @brief getOCRIndexSize
|
||||||
|
* @return 当前需要处理的OCR索引数量
|
||||||
|
*/
|
||||||
uint getOCRIndexSize();
|
uint getOCRIndexSize();
|
||||||
|
/**
|
||||||
|
* @brief getBasicIndexProgress
|
||||||
|
* @return 基础索引进度
|
||||||
|
*/
|
||||||
uint getBasicIndexProgress();
|
uint getBasicIndexProgress();
|
||||||
|
/**
|
||||||
|
* @brief getContentIndexProgress
|
||||||
|
* @return 内容索引进度
|
||||||
|
*/
|
||||||
uint getContentIndexProgress();
|
uint getContentIndexProgress();
|
||||||
|
/**
|
||||||
|
* @brief getOCRIndexProgress
|
||||||
|
* @return ocr索引进度
|
||||||
|
*/
|
||||||
uint getOCRIndexProgress();
|
uint getOCRIndexProgress();
|
||||||
|
/**
|
||||||
|
* @brief getBasicIndexDocNum
|
||||||
|
* @return 基础索引完成的总文档数
|
||||||
|
*/
|
||||||
uint getBasicIndexDocNum();
|
uint getBasicIndexDocNum();
|
||||||
|
/**
|
||||||
|
* @brief getContentIndexDocNum
|
||||||
|
* @return 内容索引完成的总文档数
|
||||||
|
*/
|
||||||
uint getContentIndexDocNum();
|
uint getContentIndexDocNum();
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void indexStateChanged(IndexScheduler::IndexerState);
|
/**
|
||||||
|
* @brief indexStateChanged
|
||||||
|
* 索引调度器状态
|
||||||
|
*/
|
||||||
|
void indexStateChanged(QString);
|
||||||
|
/**
|
||||||
|
* @brief basicIndexSizeChange
|
||||||
|
* 基础索引进度
|
||||||
|
*/
|
||||||
void basicIndexSizeChange(uint);
|
void basicIndexSizeChange(uint);
|
||||||
|
/**
|
||||||
|
* @brief contentIndexSizeChange
|
||||||
|
* 内容索引总量(包括OCR索引)
|
||||||
|
*/
|
||||||
void contentIndexSizeChange(uint);
|
void contentIndexSizeChange(uint);
|
||||||
|
/**
|
||||||
|
* @brief ocrIndexSizeChange
|
||||||
|
* OCR索引总量
|
||||||
|
*/
|
||||||
void ocrIndexSizeChange(uint);
|
void ocrIndexSizeChange(uint);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief basicIndexProgressUpdate
|
||||||
|
* 基础索引进度
|
||||||
|
*/
|
||||||
void basicIndexProgressUpdate(uint);
|
void basicIndexProgressUpdate(uint);
|
||||||
|
/**
|
||||||
|
* @brief contentIndexProgressUpdate
|
||||||
|
* 内容索引进度(包含OCR索引)
|
||||||
|
*/
|
||||||
void contentIndexProgressUpdate(uint);
|
void contentIndexProgressUpdate(uint);
|
||||||
|
/**
|
||||||
|
* @brief ocrIndexProgressUpdate
|
||||||
|
* OCR索引进度
|
||||||
|
*/
|
||||||
void ocrIndexProgressUpdate(uint);
|
void ocrIndexProgressUpdate(uint);
|
||||||
|
/**
|
||||||
|
* @brief basicIndexDocNumUpdate
|
||||||
|
* 基础索引完成的总文档数
|
||||||
|
*/
|
||||||
void basicIndexDocNumUpdate(uint);
|
void basicIndexDocNumUpdate(uint);
|
||||||
|
/**
|
||||||
|
* @brief contentIndexDocNumUpdate
|
||||||
|
* 内容索引完成的总文档数
|
||||||
|
*/
|
||||||
void contentIndexDocNumUpdate(uint);
|
void contentIndexDocNumUpdate(uint);
|
||||||
|
/**
|
||||||
|
* @brief basicIndexDone
|
||||||
|
* 基础索引数据库建立完成或完成增量更新
|
||||||
|
*/
|
||||||
|
void basicIndexDone();
|
||||||
|
/**
|
||||||
|
* @brief contentIndexDone
|
||||||
|
* 内容索引数据库建立完成或完成增量更新
|
||||||
|
*/
|
||||||
|
void contentIndexDone();
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void onIndexStateChanged(IndexScheduler::IndexerState);
|
void onIndexStateChanged(IndexScheduler::IndexerState);
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022, KylinSoft Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*
|
||||||
|
*/
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
|
|
@ -1,6 +1,137 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022, KylinSoft Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*
|
||||||
|
*/
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Window 2.12
|
import QtQuick.Layouts 1.12
|
||||||
|
|
||||||
Window {
|
Rectangle {
|
||||||
|
height: 180
|
||||||
|
width: 320
|
||||||
|
Column {
|
||||||
|
visible: true
|
||||||
|
width: parent.width
|
||||||
|
height: childrenRect.height
|
||||||
|
StatusKeyValue {
|
||||||
|
id: basicIndexDocumentNum
|
||||||
|
keyText: qsTr("Basic index document number")
|
||||||
|
valueText: "--"
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusKeyValue {
|
||||||
|
id: contentIndexDocumentNum
|
||||||
|
keyText: qsTr("Content index document number")
|
||||||
|
valueText: "--"
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusKeyValue {
|
||||||
|
id: indexState
|
||||||
|
keyText: qsTr("Index state")
|
||||||
|
valueText: "--"
|
||||||
|
}
|
||||||
|
|
||||||
|
IndexProgressBar {
|
||||||
|
id: basicIndexProgress
|
||||||
|
width: parent.width;
|
||||||
|
name: "Basic index progress"
|
||||||
|
from: 0
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
IndexProgressBar {
|
||||||
|
id: contentIndexProgress
|
||||||
|
width: parent.width;
|
||||||
|
name: "Content index progress"
|
||||||
|
from: 0
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
IndexProgressBar {
|
||||||
|
id: ocrIndexProgress
|
||||||
|
name: "OCR index progress"
|
||||||
|
width: parent.width;
|
||||||
|
from: 0
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
basicIndexDocumentNum.valueText = monitor.basicIndexDocNum
|
||||||
|
contentIndexDocumentNum.valueText = monitor.contentIndexDocNum
|
||||||
|
indexState.valueText = monitor.indexState
|
||||||
|
monitor.basicIndexDocNumUpdate.connect(onBasicIndexDocNumUpdate);
|
||||||
|
monitor.contentIndexDocNumUpdate.connect(onContentIndexDocumentNum);
|
||||||
|
monitor.indexStateChanged.connect(onIndexStateChanged);
|
||||||
|
monitor.basicIndexSizeChange.connect(onBasicIndexSizeChange);
|
||||||
|
monitor.basicIndexProgressUpdate.connect(onBasicIndexProgressUpdate);
|
||||||
|
monitor.contentIndexSizeChange.connect(onContentIndexSizeChange);
|
||||||
|
monitor.contentIndexProgressUpdate.connect(onContentIndexProgressUpdate);
|
||||||
|
monitor.ocrIndexSizeChange.connect(onOcrIndexSizeChange);
|
||||||
|
monitor.onOcrIndexProgressUpdate.connect(onOcrIndexProgressUpdate);
|
||||||
|
monitor.basicIndexDone.connect(onBasicIndexDone);
|
||||||
|
monitor.contentIndexDone.connect(onContentIndexDone);
|
||||||
|
}
|
||||||
|
function onBasicIndexDocNumUpdate(num) {
|
||||||
|
var numStr = "%1";
|
||||||
|
basicIndexDocumentNum.valueText = numStr.arg(num);
|
||||||
|
}
|
||||||
|
function onContentIndexDocumentNum(num) {
|
||||||
|
var numStr = "%1";
|
||||||
|
contentIndexDocumentNum.valueText = numStr.arg(num);
|
||||||
|
}
|
||||||
|
function onIndexStateChanged(state) {
|
||||||
|
indexState.valueText = state;
|
||||||
|
}
|
||||||
|
function onBasicIndexSizeChange(num) {
|
||||||
|
if(!basicIndexProgress.visible) {
|
||||||
|
basicIndexProgress.visible = true;
|
||||||
|
}
|
||||||
|
basicIndexProgress.to = num;
|
||||||
|
}
|
||||||
|
function onBasicIndexProgressUpdate(num) {
|
||||||
|
basicIndexProgress.value = num;
|
||||||
|
basicIndexProgress.state = "Running"
|
||||||
|
}
|
||||||
|
function onContentIndexSizeChange(num) {
|
||||||
|
if(!contentIndexProgress.visible) {
|
||||||
|
contentIndexProgress.visible = true;
|
||||||
|
}
|
||||||
|
contentIndexProgress.to = num;
|
||||||
|
}
|
||||||
|
function onContentIndexProgressUpdate(num) {
|
||||||
|
contentIndexProgress.value = num;
|
||||||
|
contentIndexProgress.state = "Running"
|
||||||
|
}
|
||||||
|
function onOcrIndexSizeChange(num) {
|
||||||
|
if(!ocrIndexProgress.visible) {
|
||||||
|
ocrIndexProgress.visible = true;
|
||||||
|
}
|
||||||
|
ocrIndexProgress.to = num;
|
||||||
|
}
|
||||||
|
function onOcrIndexProgressUpdate(num) {
|
||||||
|
ocrIndexProgress.value = num;
|
||||||
|
ocrIndexProgress.state = "Running"
|
||||||
|
}
|
||||||
|
function onBasicIndexDone() {
|
||||||
|
basicIndexProgress.state = "Done"
|
||||||
|
}
|
||||||
|
function onContentIndexDone() {
|
||||||
|
contentIndexProgress.state = "Done"
|
||||||
|
ocrIndexProgress.state = "Done"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,105 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022, KylinSoft Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*
|
||||||
|
*/
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Controls 2.5
|
import QtQuick.Controls 2.5
|
||||||
|
|
||||||
Item {
|
Column {
|
||||||
ProgressBar {
|
id: progressBar
|
||||||
|
width: parent.width
|
||||||
|
property var from: 0
|
||||||
|
property var to: 0
|
||||||
|
property var value: 0
|
||||||
|
property string name: ""
|
||||||
|
property string state: ""
|
||||||
|
|
||||||
|
Row {
|
||||||
|
Text {
|
||||||
|
id: progressName
|
||||||
|
anchors.left: parent.Left
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.family: "stxihei"
|
||||||
|
font.pixelSize: 14
|
||||||
|
color: "black"
|
||||||
|
text: progressBar.name
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: progressState
|
||||||
|
anchors.left: parent.Right
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.family: "stxihei"
|
||||||
|
font.pixelSize: 14
|
||||||
|
color: "blue"
|
||||||
|
text: progressBar.state
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Row {
|
||||||
|
width: parent.width
|
||||||
|
ProgressBar {
|
||||||
|
width: parent.width * 2 / 3
|
||||||
|
height: 16
|
||||||
|
from: progressBar.from
|
||||||
|
to: progressBar.to
|
||||||
|
value: progressBar.value
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: progressNum
|
||||||
|
anchors.left: parent.Right
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.family: "stxihei"
|
||||||
|
font.pixelSize: 10
|
||||||
|
color: "blue"
|
||||||
|
|
||||||
|
text: "--/--"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
updateProgressNum();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
onToChanged: {
|
||||||
|
updateProgressNum();
|
||||||
|
}
|
||||||
|
|
||||||
|
onValueChanged: {
|
||||||
|
updateProgressNum();
|
||||||
|
}
|
||||||
|
|
||||||
|
onNameChanged: {
|
||||||
|
progressName.text = progressBar.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
onStateChanged: {
|
||||||
|
progressState.text = progressBar.state;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateProgressNum() {
|
||||||
|
var str = "%1/%2";
|
||||||
|
progressNum.text = str.arg(progressBar.value).arg(progressBar.to);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022, KylinSoft Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
import QtQuick 2.0
|
||||||
|
|
||||||
|
Row {
|
||||||
|
id: kvRow
|
||||||
|
width: parent.width
|
||||||
|
height: childrenRect.height
|
||||||
|
property string keyText : "--"
|
||||||
|
property string valueText :"--"
|
||||||
|
Text {
|
||||||
|
id: keyTextLabel
|
||||||
|
anchors.left: parent.Left
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.family: "stxihei"
|
||||||
|
font.pixelSize: 16
|
||||||
|
color: "black"
|
||||||
|
text: kvRow.keyText
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: valueTextLabel
|
||||||
|
anchors.left: parent.Right
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.family: "stxihei"
|
||||||
|
font.pixelSize: 16
|
||||||
|
color: "blue"
|
||||||
|
text: kvRow.valueText
|
||||||
|
}
|
||||||
|
onKeyTextChanged: {
|
||||||
|
keyTextLabel.text = keyText
|
||||||
|
}
|
||||||
|
onValueTextChanged: {
|
||||||
|
valueTextLabel.text = valueText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,5 +4,6 @@ RESOURCES += qmlFile
|
||||||
|
|
||||||
DISTFILES += \
|
DISTFILES += \
|
||||||
$$PWD/IndexMonitor.qml \
|
$$PWD/IndexMonitor.qml \
|
||||||
$$PWD/IndexProgressBar.qml
|
$$PWD/IndexProgressBar.qml \
|
||||||
|
$$PWD/StatusKeyValue.qml
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022, KylinSoft Co., Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*
|
||||||
|
*/
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QDBusConnection>
|
#include <QDBusConnection>
|
||||||
#include <QQmlContext>
|
#include <QQmlContext>
|
||||||
|
@ -91,8 +110,12 @@ void UkuiSearchService::parseCmd(QString msg, bool isPrimary)
|
||||||
|
|
||||||
void UkuiSearchService::loadMonitorWindow()
|
void UkuiSearchService::loadMonitorWindow()
|
||||||
{
|
{
|
||||||
|
if(!m_monitor) {
|
||||||
|
m_monitor = new Monitor(m_indexScheduler, this);
|
||||||
|
}
|
||||||
if(!m_quickView) {
|
if(!m_quickView) {
|
||||||
m_quickView = new QQuickView();
|
m_quickView = new QQuickView();
|
||||||
|
m_quickView->setResizeMode(QQuickView::SizeRootObjectToView);
|
||||||
m_quickView->rootContext()->setContextProperty("monitor", m_monitor);
|
m_quickView->rootContext()->setContextProperty("monitor", m_monitor);
|
||||||
m_quickView->setSource(m_qmlPath);
|
m_quickView->setSource(m_qmlPath);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ private:
|
||||||
IndexScheduler *m_indexScheduler = nullptr;
|
IndexScheduler *m_indexScheduler = nullptr;
|
||||||
Monitor *m_monitor = nullptr;
|
Monitor *m_monitor = nullptr;
|
||||||
QQuickView *m_quickView = nullptr;
|
QQuickView *m_quickView = nullptr;
|
||||||
QString m_qmlPath = "qrc:/qml/IndexMonitor.qml";
|
QUrl m_qmlPath = QString("qrc:/qml/IndexMonitor.qml");
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue